本博文源于浙江大学《数据结构》,今天跟着姥姥学希尔排序。课程上面,希尔排序的囧态是这样子的:
就因为绕来绕去还不忘回到本质一个插入排序搞定,导致如何定义增量序列是一个极大的问题,下面我就讨论由希尔排序引申出来的Sedgewick希尔排序,如果大家对希尔排序源码还不是很了解,可以看这个博文:
(C语言浙大版)小白实现希尔排序并分析增量序列(附测试用例)
然后下面进行分析!
原始希尔排序原理
就是将待排序的一组元素按一定间隔分为若干个序列,分别进行插入排序。开始时设置的间隔较大,然后逐步减小,等到1的时候就变成插入排序。
Sedgewick增量序列
就是这玩意,看起来会手足无措,其实这个增量序列是靠公式来生成的。只需要把i=0,1,2,3…带进去让程序自己生成就行了,然后根据我们排序的数量,让Sedgewick序列不超过要排列的数列就行了。然后按照希尔排序的老样子进行排序就可以实现Sedgewick增量序列的排序
测试用例
int arr[5] = {5,3,1,6,2};
整型数组只是容器,5也只是数字,可以由自己来进行变动。
附上源码
//Sedgewick增量序列的希尔排序
//希尔排序
#include<stdio.h>
typedef int ElementType;
void Print_Array(ElementType A[],int N)
{
printf("\n");
for(int i=0;i<N;i++)
printf("%d ",A[i]);
}
void Shell_sort(ElementType A[], int N)
{
int Si,D,P,i;
ElementType Tmp;
int Sedgewick[] = {929,505,209,109,41,19,5,1,0};
for(Si = 0;Sedgewick[Si]>=N;Si++) ;
for(D=Sedgewick[Si];D>0;D=Sedgewick[++Si])
for(P=D;P<N;P++) {
Tmp = A[P];
for(i=P;i>=D && A[i-D]>Tmp;i-=D)
A[i] = A[i-D];
A[i] = Tmp;
}
}
int main()
{
int arr[5] = {5,3,1,6,2};
Print_Array(arr,5);
Shell_sort(arr,5);
Print_Array(arr,5);
return 0;
}