希尔排序

简介: 希尔排序

shellSort

https://www.cnblogs.com/chengxiao/p/6104371.html

希尔排序,也称缩小增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。同时该算法是冲破O(n^2)的第一批算法之一,希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O(n^2 ) 复杂度的算法快得多

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
  • 但插入排序一般来说是低效的,因为插入排序每次比较后只能将数据移动一个位置

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

  1. 外层循环控制间隔的缩小,间隔gap初始为n/2,每次二分直到为1,排序完成
  2. 内层循环就是间隔为gap的插入排序,把插入排序的第二层循环中的1全部换成gap即可

算法步骤

template<typenameT>

voidshellSort(Tarr[],intn){

   for(intgap=n/2;gap>0;gap/=2){

       //希尔排序内部循环是插入排序,插入排序增量为1,希尔排序增量由外层循环控制

       //从第gap个元素,进行插入排序

       for(inti=gap;i<n;i++){

           Te=arr[i];

           intj;

           //对第一组的部分元素进行排序

           //希尔排序每次移动为gap,即间隔为gap

           for(j=i;j-gap>=0;j=j-gap){

               if(e<arr[j-gap])//往后移增量个

                   arr[j]=arr[j-gap];

               elsebreak;

           }

           arr[j]=e;

       }

   }

}

template<typenameT>

voidshellSort(Tarr[],intn){

   //缩小增量直到1

   for(intgap=n/2;gap>0;gap/=2)

       //从第gap个元素,逐个对其所在组进行直接插入排序操作

       for(inti=gap;i<n;i++){

           intj=i;

           inttemp=arr[i];

           //与前面的元素进行比较

           while(j-gap>=0&&arr[j-gap]>temp){

               arr[j]=arr[j-gap];

               j-=gap;

           }

           arr[j]=temp;

       }

}


目录
相关文章
|
数据挖掘 索引
RNA-seq数据分析一:(HISAT2+featureCounts)
RNA-seq数据分析一:(HISAT2+featureCounts)
|
10月前
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
354 0
|
人工智能 供应链 算法
量子计算机有什么用?
【8月更文挑战第5天】量子计算机有什么用?
602 3
基于贝叶斯推理估计稳态 (ST) 和非稳态 (NS) LPIII 模型分布拟合到峰值放电(Matlab代码实现)
基于贝叶斯推理估计稳态 (ST) 和非稳态 (NS) LPIII 模型分布拟合到峰值放电(Matlab代码实现)
208 0
|
缓存
scanf和getchar大家都用过吧!那么缓存区的概念你必须了解!(下)
scanf和getchar大家都用过吧!那么缓存区的概念你必须了解!(下)
186 0
|
人工智能 前端开发 JavaScript
「CSS 只要三节课」之精通
「CSS 只要三节课」之精通
103 0
|
Docker 容器
Docker文件传输丨如何挂载目录?实现容器和宿主机之间的数据共享,方便开发和部署
Docker文件传输丨如何挂载目录?实现容器和宿主机之间的数据共享,方便开发和部署
|
存储 SQL 监控
Java线程池必备知识:核心参数、工作流、监控、调优手段
① 合理使用线程池的好处 ② 线程池的工作流程 ③ 线程池的创建(7个参数) ④ 向线程池提交任务 ⑤ 线程池的五种运行状态 ⑥ 线程池的关闭(shutdown或者shutdownNow方法) java线程池的调优以及监控 Java线程池的常见问题
100592 12
Java线程池必备知识:核心参数、工作流、监控、调优手段
|
算法
六六力扣刷题回溯之全排列
六六力扣刷题回溯之全排列
70 0