希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
基本思路是先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2,直至增量为1;
利用C语言写的希尔排序的算法如下:
平均时间复杂度为O(N**d),最坏时间复杂度为O(NN),稳定性为不稳定;
#include <stdio.h>
void shell_Sort(int A[],int N);
int main (void)
{
int i;
int arr[21] = {2,6,9,11,3,1,7,4,17,26,14,56,90,67,43,32,12,19,100,23,0};
shell_Sort(arr,21);
for (i = 0; i< 21; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
void shell_Sort(int A[],int N)
{
int i,j;
int D;//存储希尔增量的值
int Tmp;//储存临时的值
for(D = N/2; D > 0;D /= 2)
{
for(i = D; i < N; i++)
{
Tmp = A[i];//相当于第二张摸的牌
for( j = i; j >= D && A[j - D] > Tmp; j -= D)//用Tmp去跟前面D间隔的元素进行排序
{
A[j] = A[j - D];//空出个位置给Tmp
}
A[j] = Tmp;//此时j就是Tmp位置
}
}
}