首页 > 其他分享 >希尔排序

希尔排序

时间:2023-03-30 20:57:23浏览次数:32  
标签:idx 插入排序 gap 希尔 arrs 序列 排序

希尔排序

欢迎关注fish的公众号:fish码农成长之旅

希尔排序也叫做递减增量排序算法,他是插入排序的高效改进版本。基本思想是将待排序的序列分成若干子序列分别进行插入排序,然后待整个序列基本有序的时候,再对整个序列排序。直观上看就是把数列进行分组(不停使用插入排序),直至从宏观上看起来有序,最后插入排序起来就容易了(无须多次移位或交换)。

算法步骤

首先我们选择一个增量序列,就是选择相隔多少位数为一个子序列,每次增量序列全部插入排序完之后,增量减少直到为1;gap1, gap2, gap3 ... gapk = 1。

按照我们的增量序列个数进行排序k次,每一次依据增量大小将整个序列分割成若干长度为m的子序列分别进行插入排序。

一次排序完成,增量减少,当增量为1时,整个序列作为一个表。

实例演示

总共7个数的排序,按照从小到大排序,原始数据为:3 38 5 1 9 4 10

首先第一次排序,按照gap=4将序列分为四组,每组元素在原来的索引上按照插入排序进行排序完成。
第二次排序gap=2将序列分为两组,依旧在原来的索引按照插入排序进行。
第三次gap=1,整个序列就相当于作一次插入排序。

代码实现

template <class T>
void shell_sort(std::vector<T> &arrs) {
  int n = arrs.size();  // 数组的大小
  if (n <= 1) {         // 一个数的情况不需要排序
    return;
  }

  int gap = (n + 1) / 2; // 首先按照俩个一组分个序列

  while (gap >= 1) {
    for (int idx_i = gap; idx_i < n; ++idx_i) {
      // 这里跟直接插入排序的区别就是每次idx_j要减去gap才能保证是对一个组的元素进行插入排序
      for (int idx_j = idx_i; idx_j >= gap && arrs[idx_j] < arrs[idx_j - gap];
           idx_j -= gap) {
        std::swap(arrs[idx_j], arrs[idx_j - gap]);
      }
    }

    gap /= 2;
  }
}

标签:idx,插入排序,gap,希尔,arrs,序列,排序
From: https://www.cnblogs.com/xiguan/p/17274246.html

相关文章

  • 有关归并排序-Java实现
    有关归并排序:其中的分治思想很值得参考:1/**2*归并排序块合并3*@paramnum目标的排序数组4*@paramleftIndex传入的分治块的做左端索引5*@parammid中间索引6*@paramrightIndex传入的分治块的做右端索引7*@param......
  • 插入排序
    欢迎关注fish的公众号:fish码农成长之旅插入排序的算法实现没有冒泡排序跟选择排序来的那么的直观易懂,但是其算法思想是最容易理解的。通过构建有序序列,对于未排序的序......
  • MySQL:批量修改排序规则
    生成修改表排序规则的SQL语句SELECTCONCAT('ALTERTABLE',TABLE_SCHEMA,'.',TABLE_NAME,             'CONVERTTOCHARACTERSETutf8mb4COLLATEu......
  • ES定制化排序的骚操作
    一.通过邻尽查询提升相关度1.配合使用match_query和match_phrease2.match_phrease匹配条件比match_query复杂二.直接通过排序存在哪些问题1.将权重转化为排序的先后顺......
  • Leetcode81. 搜索旋转排序数组 II
    classSolution{public:boolcheck(vector<int>&nums,inttarget,intl,intr)//[l,r]区间查找target{while(l<r){intmid=(......
  • 练习——简易的冒泡排序
    packagecom.q1u.array;importjava.util.Arrays;//冒泡排序//1.比较数组中两个相邻的元素,如果第一个数大于第二个,交换两者位置//2.每一次比较,都会产生一个最大或者......
  • 确定比赛名次 HDU - 1285 (拓扑排序)
    题意:有N个比赛队(1≤N≤500),编号依次为1,2,3,...,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比......
  • 老是忘记的字典排序
    amount_total=0forsubscription_type,product_infoinbill_group_dict.items():consume_group_doc_lst["subscription_type"]=subscription_typeconsume_gr......
  • 选择排序
    欢迎关注fish的公众号:fish码农成长之旅相信大家对扑克牌并不陌生,当我们在齐牌的时候是不是会按照大小顺序进行排列,选择排序的过程就跟扑克牌差不多一样的直观简单。其......
  • Java学习----冒泡排序
    冒泡排序importjava.util.Arrays;publicclassMaoPaoPaiXu{publicstaticvoidmain(String[]args){int[]a={1,2,3,5,7,9,22,44,63,75};......