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

希尔排序

时间:2022-10-27 11:00:09浏览次数:41  
标签:插入排序 gap 希尔 增量 排序 复杂度

希尔排序

一、概念及其介绍

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。

它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

二、适用说明

希尔排序时间复杂度是 O(n^(1.3-2)),空间复杂度为常数阶 O(1)。希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O(n^2 ) 复杂度的算法快得多。

三、过程图示

希尔排序目的为了加快速度改进了插入排序,交换不相邻的元素对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。

在此我们选择增量 gap=length/2,缩小增量以 gap = gap/2 的方式,用序列 {n/2,(n/2)/2...1} 来表示。

如图示例:

(1)初始增量第一趟 gap = length/2 = 4

(2)第二趟,增量缩小为 2

(3)第三趟,增量缩小为 1,得到最终排序结果

标签:插入排序,gap,希尔,增量,排序,复杂度
From: https://www.cnblogs.com/happy12123/p/16831463.html

相关文章

  • mysql分组排序加序号
    mysql分组排序后取出几条记录,每一组你要显示几条数据?用groupbycc看看是你想要的吗?selectreason,floor(总数*0.8)from表明groupbyccorderbycc;你看我的截图mysql分组排序......
  • java排序算法(Java排序算法图解)
    如何理解排序算法的C++算法?排序算法C++算法编辑C++自带的algorithm库函数中提供了排序算法如何理解排序算法的C++算法?排序算法C++算法编辑C++自带的algorithm库函数中提供了......
  • java插入排序
    如何才能插入排序描?如何才能插入排序描述思路假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它......
  • Acwing 787.归并排序
    注意理解代码层次。#include<bits/stdc++.h>usingnamespacestd;#defineN10e5+10;//数组开太小容易栈溢出inta[N],tmp[N];voidmerge_sort(intq[],intl......
  • 常见排序算法整理
     importjava.util.Random;publicclassSorting{/***Foreachelement,comparewithalltheelementsbeforeitandswappositionaccordingly......
  • Acwing 快速排序
    基于分治的思想,每次划分后,保证基准(x)前的数都比基准小,其后的树都比基准大即可。#include<iostream>usingnamespacestd;constintN=100010;intq[N];voidquic......
  • 田忌赛马(带索引的数组排序)
    870. AdvantageShuffleMedium27821FavoriteShareGiventwoarrays ​​A​​​ and ​​B​​ ofequalsize,the advantageof ​​A​​ withrespectto ​​......
  • 从排序阵列中删除重复 II
    题目来源​​RemoveDuplicatesfromSortedArrayII​​问题描述“删除重复项目”的进阶:如果重复最多被允许两次,又该怎么办呢?例如:给定排序数列nums=[1,1,1,2,2,3]......
  • 从排序数组中删除重复项
    题目来源​​RemoveDuplicatesfromSortedArray​​题目描述给定一个有序数组,你需要原地删除其中的重复内容,使每个元素只出现一次,并返回新的长度。不要另外定义一个数......
  • 从小到大排序
    题目描述六一儿童节,老师带了很多好吃的巧克力到幼儿园。每块巧克力j的重量为w[j],对于每个小朋友i,当他分到的巧克力大小达到h[i](即w[j]>=h[i]),他才会上去表演节目。老师的......