zoukankan      html  css  js  c++  java
  • 希尔排序

    图片转载自:https://blog.csdn.net/weixin_37818081/article/details/79202115

    1.几个名词解释

    1)增量(步长):待处理的序列中每个元素间的距离,可自行设置

    增量设置的规则:

      1.常用规则:increment = increment / 3 + 1(increment 的初始值为数组长度)

      2.希尔规则:increment = increment / 2(increment 的初始值为数组长度)

    2)基本有序:小的基本在前面,大的基本在后面,不大不小的基本在中间

    2.排序思想

    1)希尔排序是直接插入排序的改进,同属插入排序类,直接插入排序对基本有序的序列排序很高效,同时当元素个数比较少时,直接插入排序也很高效;针对这两个特性,希尔排序利用增量进行分组,对每个组进行排序,形成基本有序,同时分组后每组的元素个数也会变少

    2)设置一个增量,将相距一个增量的元素组成若干个子序列,对每个子序列分别进行直接插入排序;然后按规则缩小增量,再次根据增量将整个序列分成若干子序列,并分别对子序列进行直接插入排序;不断重复上述操作,直到增量缩小到1,进行最后一次直接插入排序,则完成希尔排序。在上述过程中,整个序列会从无序——>基本有序——>有序

    代码实现

    void sortShell(vector<int>& nums, int length)
    {
        int increment = length;
        while (increment > 1)
        {
            increment = increment / 3 + 1;    //增量为1时还会再排一次
            for (int i = increment; i <= length - 1; ++i)
            {
                int j = i;
                while (j >= increment && nums[j] < nums[j - increment])
                {
                    swap(nums[j], nums[j - increment]);
                    j = j - increment;
                }
            }
        }
    }

    时间复杂度

       最好情况O(n1.3),最坏情况O(n2),平均情况O(nlogn)~O(n2)

    空间复杂度

       O(1)

    稳定性

      由图可以看出是不稳定的。一次插入排序是稳定的,但在多次的子序列插入排序过程中,相同的元素可能在各自的插入排序中移动,并不能保证相同元素在排序前后的相对顺序,所以是不稳定的

  • 相关阅读:
    java+opencv实现图像灰度化
    java实现高斯平滑
    hdu 3415 单调队列
    POJ 3368 Frequent values 线段树区间合并
    UVA 11795 Mega Man's Mission 状态DP
    UVA 11552 Fewest Flops DP
    UVA 10534 Wavio Sequence DP LIS
    UVA 1424 uvalive 4256 Salesmen 简单DP
    UVA 1099 uvalive 4794 Sharing Chocolate 状态DP
    UVA 1169uvalive 3983 Robotruck 单调队列优化DP
  • 原文地址:https://www.cnblogs.com/Joezzz/p/9656585.html
Copyright © 2011-2022 走看看