花茵美凝胶效果怎么样:9.6.2 希尔排序算法(1)

来源:百度文库 编辑:中财网 时间:2024/05/05 17:49:03

9.6.2 希尔排序算法(1)

好了,为了能够真正弄明白希尔排序的算法,我们还是老办法——模拟计算机在执行算法时的步骤,还研究算法到底是如何进行排序的。

希尔排序算法代码如下。

  1. /* 对顺序表L作希尔排序 */
  2. 1 void ShellSort(SqList *L)
  3. 2 {
  4. 3 int i,j;
  5. 4 int increment=L->length;
  6. 5 do
  7. 6 {
  8. 7 incrementincrement=increment/3+1; /* 增量序列 */
  9. 8 for(i=increment+1;i<=L->length;i++)
  10. 9 {
  11. 10 if (L->r[i]r[i-increment])
  12. 11 {/* 需将L->r[i]插入有序增量子表 */
  13. 12 L->r[0]=L->r[i]; /* 暂存在L->r[0] */
  14. 13 for(j=i-increment;j>0&&L->r[0]r[j];j-=increment)
  15. 14 L->r[j+increment]=L->r[j];/*记录后移,查找插入位置 */
  16. 15 L->r[j+increment]=L->r[0]; /* 插入 */
  17. 16 }
  18. 17 }
  19. 18 }
  20. 19 while(increment>1);
  21. 20 }

1.程序开始运行,此时我们传入的SqList参数的值为length=9,r[10]= {0,9,1,5,8,3,7,4,6,2}。这就是我们需要等待排序的序列,如图9‐6‐4所示。

图9-6-4

2.第4行,变量increment就是那个“增量”,我们初始值让它等于待排序的记录数。

3.第5~19行是一个do循环,它提终止条件是increment不大于1时,其实也就是增量为1时就停止循环了。

4.第7行,这一句很关键,但也是难以理解的地方,我们后面还要谈到它,先放一放。这里执行完成后,incremen+1=4。

5.第8~17行是一个for循环,i从4+1=5开始到9结束。

6.第10行,判断L.r[i]与L.r[i‐increment]大小,L.r[5]=3小于L.r[i‐increment]=L.r[1]=9,满足条件,第12行,将L.r[5]=3暂存入L.r[0]。第13~14行的循环只是为了将L.r[1]=9的值赋给L.r[5],由于循环的增量是j‐=increment,其实它就循环了一次,此时j=‐3。第15行,再将L.r[0]=3赋值给L.r[j+increment]=L.r[‐3+4]=L.r[1]=3。如图9‐6‐5所示,事实上,这一段代码就干了一件事,就是将第5位的3和第1位的9交换了位置。

(点击查看大图)图9-6-57.循环继续,i=6,L.r[6]=7>L.r[i‐increment]=L.r[2]=1,因此不交换两者数据。如图9‐6‐6所示。
(点击查看大图)图9-6-68.循环继续,i=7,L.r[7]=4 (点击查看大图)图9-6-79.循环继续,i=8,L.r[8]=6 (点击查看大图)图9-6-8