您的位置:首页 > 理论基础 > 数据结构算法

排序(希尔排序)

2015-11-28 13:12 225 查看

1、希尔排序的简单介绍

希尔排序(shellSort)出自D.L.Shell,所以取名shell,是基于直接插入排序一种不稳定的排序方法,又称“缩小增量排序”。
希尔排序的基本思想就是:将待排序的元素分成若干组,对这些组分别进行直接插入排序,使得所有的分组有序排列,再缩小分组的范围(增量),对缩小后的若干分组继续进行分组插入排序,当范围越来越小,直到为1时,进行最后一次排序,就可以保证所有的元素都有序。
具体的实现过程:
 1.1、确定每次分组的增量,假设现有10个元素,可以将增量设为5,2,1,0
1.2、将每个分组中的元素分别进行排序,设增量为d,分组首元素下标为i,待排序的元素就是i,i+d,i+2d,i+3d……
重复上述1,2步,直到所以的元素有有序,希尔排序的基本流程是:



2、希尔排序C语言的实现

void shellSort(int *arr,int n)
{
int i,j,k,dk,*delta,key;
delta=(int *)malloc(sizeof(int)*n/2);
for(i=0,k=n; k>0; k/=2,i++) //预处理,求出每次划分的增量并保存
delta[i]=k/2;
//进行分组插入排序
for(i=0; delta[i]>0; i++)
{
for(dk=k=delta[i]; k<n; k++)
{
if(arr[k]<arr[k-dk])
{
key=arr[k];
for(j=k-dk;j>=0&&arr[j]>key;j-=dk)
arr[j+dk]=arr[j];
arr[j+dk]=key;
}//if
}//for
}//for

}

3、希尔排序的效率分析

由上面的图可以看出,shell排序是一种不稳定的排序方法,两个值相同的元素,排序之后,先后顺序发生了改变,虽然排序过程使用了三层循环,但其时间复杂度为O(n^1.3),而整个排序过程,需要一个变量为辅助的转存空间,所以空间复杂度为O(1)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息