希尔排序的总结

来源:互联网 发布:淘宝装修辅助工具 编辑:程序博客网 时间:2024/05/16 08:21

希尔排序的基本思路:把整个排序分成若干个直接插入排序(具有相同增量),逐步缩小增量,直到增量为1,这时候一趟直接插入排序就可以了使得整个序列变成一个有序序列。

关键处代码为:

ShellSort(int a[],int n){int increment = n;do{increment = increment / 3 + 1;//缩小增量OneShellSort(a,increment,n);}while(increment > 1);}

这一部分代码很好理解,主要是做了一件事情就是减小增量然后进行一趟希尔排序,直到增量为1.

然后就是一趟Shell排序了,关键部分代码如下:

//一趟Shell排序并不是真的一次执行若干个直接插入排序,至少不是完整的一趟直接插入排序//如果理解为是一趟直接插入排序这个代码就弄不明白了,实际上是从i开始往前部分的一趟直接插入排序void OneShellSort(int a[],int increment,int n){for(int i=increment;i<n;i++){if(a[i] < a[i-increment]){int j = i -increment;int temp = a[i];do{a[j+increment] = a[j];j -= increment;}while(j>0 && a[j]>temp);a[j+d] = temp;}}}


比较一下和直接插入排序的区别:

//直接插入for(int i=1;i<n;i++){temp = a[i];j = i-1;while(j>=0 && a[j] > temp){a[j+1] = a[j];j--;}a[j+1] = temp;}

到这里看出来,之所以没理解Shell一趟排序的代码并不是像注释中的那样,其实一趟直接插入排序,就是从无序区中选取第一个插入到前面的有序区中。所以对复杂一点的算法理解不好的原因不是算法的问题,而是之间准备工作就有问题,觉得是基础代码就草草了事,结果没理解清楚,看稍难一点的代码就云里雾里了。

0 0