ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

常见的排序:希尔排序

2021-08-01 20:31:30  阅读:224  来源: 互联网

标签:arr int 插入排序 常见 gap 希尔 排序 复杂度


文章目录

1. 原理

  • 直接插入排序的时间复杂度为 O(n^2) ,是比较慢的,我们对他做出了优化,经过优化的排序算法叫做希尔排序。
  • 根据直接插入排序的时间复杂度我们可以知道,直接插入排序的待排序数组越趋于有序所需要的时间越少,所以我们可以通过与排序的方式,来使待排序数组趋于有序。
  • 希尔排序对直接插入排序是怎么优化的呢?将数组分为若干个区间使用直接插入排序的方式进行预排序,采取缩小增量法,每次预排序将区间的长度缩小一定大小,当分组的区间长度为 1 时,就是直接插入排序,这样经过预排序的数组进行直接插入排序,这样就降低了时间复杂度。
  • 注意:这里的分组并不是连续的,而是按照一定的大小,每隔 m 个数选取一个数字作为区间内的一个数字。并且我们在对每个区间的直接插入排序也不是连续的。
  • 那么分组区间长度为多少呢?对于这个问题,目前没有一个最好的情况,我们将第一次长度设为 gap = (len / 3) + 1 或者 gap = (len / 2) + 1 ,每次预排序 gap = (gap / 3) + 1 或者 gap = (gap / 2) + 1

2. 代码实现

public void shellSort(int[] arr) {
    int gap = arr.length;
    // 对数组进行预排序
    while (gap > 1) {
        insertSort(arr, gap);
        gap = (gap / 3) + 1;
    }
    insertSort(arr, 1);
}

public void insertSort(int[] arr, int gap) {
    for (int i = 1; i < arr.length; i++) {
        int val = arr[i];
        int j = i - gap;
        for (; j >= 0; j -= gap) {
            if (arr[j] > val) {
                arr[j + gap] = arr[j];
            } else {
                break;
            }
        }
        arr[j + gap] = val;
    }
}
  • 由于希尔排序从根本上来说是一个直接插入排序的优化,所以认为也是稳定的。

3. 复杂度

最好时间复杂度平均时间复杂度最坏时间复杂度空间复杂度
O(n ^ 1.3) ~ O(n ^ 1.5)O(n ^ 1.3) ~ O(n ^ 1.5)O(n ^ 1.3) ~ O(n ^ 1.5)O(1)
  • 小菜鸡一枚,大家有问题可以评论,大家一起讨论。

标签:arr,int,插入排序,常见,gap,希尔,排序,复杂度
来源: https://blog.csdn.net/qq_52574924/article/details/119303024

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有