希尔排序是一种稳定的排序算法_全面解析十大排序算法之四:希尔排序

92851b3db353ee31cb7b363d634dd0a0.png 

点击上方蓝字关注我们吧

cfab8a81f6b231edbb8b5fc994f29047.png

1. 十种排序算法的复杂度和稳定性

37f483fa46b54d955a9f98665b0d78a0.png

fe6a8eb0a3d034a4f4158c711a9503f5.png fe6a8eb0a3d034a4f4158c711a9503f5.png

时间复杂度:一个算法消耗所需要的时间

空间复杂度:运行一个算法所需要的内存时间

稳定性:如一个排列数组:1、4、5、6、4、7. 此时有一对相等的数字 4 ,设前面的4为 a4,后一个4 为 b4。 如果排序之后 a4 仍然在 b4 前面,则表示此种算法排序是具有稳定性的;如果排序之后 a4 在 b4 后面,则表示是 不稳定性的。

fe6a8eb0a3d034a4f4158c711a9503f5.png fe6a8eb0a3d034a4f4158c711a9503f5.png

2. 什么是希尔排序

希尔排序,是插入排序的一种更高效的改进版本。不太懂插入排序的小伙伴们,可以看这篇文章。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。

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

  • 1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;

  • 2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;

3. 插入排序算法运行过程

插入排序算法运行过程视频演示

希尔排序是插入排序的改进版本,运行方式类似于插入排序,只是插入排序是间隔一个数字。希尔排序在一开始间隔多位数字进行排序,然后按一定规则依次减少间隔位,其实,内在原理还是属于插入排序。

希尔排序的思想是采用插入排序的方法,先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2,接着让 h = n / 4,让 h 一直缩小,当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有序的了。

d14b95c7d1ba137ad832f24fcba8d680.png

4. 代码实现

Python实现

def shell_sort(alist):    n = len(alist)    gap = n//2    while gap > 0:        for i in range(gap, n):            j = i             while j >= gap and alist[j-gap] > alist[j]: #插入排序                alist[j-gap], alist[j] = alist[j], alist[j-gap]                j -= gap  # 确保循环只能进行一次        gap //= 2    return alist

Java实现

public static void shellSort(int[] arrays) {

C++实现

#includeusing namespace std;void swap(int&a, int&b) {    int tmp = a;    a = b;    b = tmp;}void shellSort(int a[], int len) {    int gap = len ;    while (gap = gap / 2) {//增量        for (int i = gap; i < len; i++) {            cout << i << " ";            int key = a[i];//待排序元素            int j = i - gap;            for (; j+1>0&&a[j ] > key; j -= gap) {//插入排序                a[j + gap] = a[j];            }            a[j + gap] = key;        }    }}

希尔排序的增量选择方法

上述代码才有的是折半的方式来进行插入排序,下列还有其他两种增量的方法

  • 第一种增量是最初Donald Shell提出的增量,即折半降低直到1。据研究,使用希尔增量,其时间复杂度还是O(n2)。

  • 第二种增量Hibbard:{1, 3, ..., 2k-1}。该增量序列的时间复杂度大约是O(n1.5)。

  • 第三种增量Sedgewick增量:(1, 5, 19, 41, 109,...),其生成序列或者是94^i - 92^i + 1或者是4^i - 3*2^i + 1。

往期推荐

  • 冒泡排序
  • 选择排序
  • 插入排序

END

dcfeb015eedfa1c8b2417bb0aaccb359.png

扫描关注我们

免费分享程序员面经、机器学习、编程语言等,

1300G互联网视频、书籍资源,各种干货。

生活不止于编程,爱编程更爱生活。

5624c22348f15b936644597e91d5f849.png 385c1586fdac91754b3afbc2eb59c9d8.png

文章好看点这里

0422d371eee08d4b8ee996ce8ec9687a.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值