zoukankan      html  css  js  c++  java
  • 希尔排序

    先将待排序表分割成若干个形如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)
    不稳定的排序















  • 相关阅读:
    mysql字符集设置
    mysql解压版服务启动方式
    html的表格边框为什么会这么粗?
    通过js获取tinymce4.x的值
    bzoj 3083 树链剖分
    bzoj 1143 二分图最大独立集
    bzoj 2303 并查集
    可持久化数据结构讲解
    bzoj 1072 状压DP
    bzoj 2741 可持久化trie
  • 原文地址:https://www.cnblogs.com/zhuzhenfeng/p/8c127de7e99c6668fab2f8f76fb60dd5.html
Copyright © 2011-2022 走看看