希尔排序

先将待排序表分割成若干个形如L[i,i+d,i+2d,i+3d,...i+kd]的特殊子表,分别进行直接插入排序,当整个表中的元素已经基本有序的时候,再对全体记录进行一次直接插入排序。
先取一个小于n的步长d1,把表中的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中,在各组中进行直接插入排序;然后取第二个步长d2<d1,重复上述的过程,知道dt=1,即所有的记录已放在同一组中,再进行直接插入排序。
增量序列一般选择d1=n/2, di+1=[di/2],并且最后一个增量等于1.

  1. void ShellSort(ElemType A[], int n)
  2. {
  3. //对顺序表中做希尔插入排序,本算法与直接插入排序相比,做了如下的修改
  4. //前后记录位置的增量式dk,不是1
  5. //r[0]只是暂存单元,不是哨兵,当j<0时,插入位置已到
  6. for(dk=len/2; dk>=1; dk=dk/2)//步长变化
  7. {
  8. for(i=dk+1; i<=n; i++)
  9. {
  10. if(A[i].key<A[i-dk].key)//需将A[i]插入有序增量子表
  11. {
  12. A[0]=A[i];//暂存在A[0]
  13. for(j=i-dk; j>0&&A[0].key<A[j].key; j-=dk)
  14. {
  15. A[j+dk]=A[j];//记录后移,查找插入的位置
  16. }
  17. A[j+dk]=A[0];//插入
  18. }
  19. }
  20. }
  21. }
时间复杂度:o(n^2)
不稳定的排序















posted @ 2015-08-22 14:34  Lucas_1993  阅读(141)  评论(0编辑  收藏  举报