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)
    不稳定的排序















  • 相关阅读:
    3.for in循环
    2.break与continue
    1.XHTML框架结构
    lamda表达式在EF中的应用
    View数据呈现相关技术
    ASP.NET MVC 4 技术讲解
    ASP.NET MVC 相关的社群与讨论区
    C# 随机红包算法
    圆圈里带 小写字母,大写字母
    使用SQL语句 检测 MSSQL死锁
  • 原文地址:https://www.cnblogs.com/zhuzhenfeng/p/8c127de7e99c6668fab2f8f76fb60dd5.html
Copyright © 2011-2022 走看看