排序 | 希尔排序

Posted YOUCRY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序 | 希尔排序相关的知识,希望对你有一定的参考价值。

1.冲破O(n^2),插入排序竟能有突破性改进?


希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插 入排 序算法排序; 着增量逐渐减少,每组包含的关键词越来越多,当增 量减至1时,整个文件恰被 分成一组,算法 便终止。
希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。


示例 1

输入:arr = [8,7,6,5,4,3,2,1]

输出:[1,2,3,4,5,6,7,8]

排序 | 希尔排序


排序 | 希尔排序


2.想法


希尔排序时间复杂度均为O( n+yita ) 。空间复杂度为 O(1)。
希尔排序为不稳定的排序算法。
排序 | 希尔排序
排序 | 希尔排序


3.代码


排序 | 希尔排序
class Solution {public: void shellSort(vector<int>& arr){ //逐步缩小增量gap for(int gap=arr.size()/2;gap>0;gap/=2){ //从第gap个元素,对组内进行插入排序 for(int i=gap;i<arr.size();i++){                int j=i; int temp=arr[j]; if(arr[j]<arr[j-gap]){ while(j-gap>=0&&temp<arr[j-gap]){ arr[j]=arr[j-gap]; j-=gap; } arr[j]=temp;                } }   
     } }};






END







关注我们

https://leetcode-cn.com/u/cdxx/
ALWAYS HERE



以上是关于排序 | 希尔排序的主要内容,如果未能解决你的问题,请参考以下文章

希尔排序

插入排序(直接插入排序折半插入排序希尔排序的算法思想及代码实现)

希尔排序图解与代码

《算法》笔记 3 - 选择排序插入排序希尔排序

数据结构:希尔排序

排序算法——希尔排序的图解代码实现以及时间复杂度分析