最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 【每日一题】化学实验基本操作(2016.10.12)

    一、排序算法系列列表二、Shell排序

    希尔排序的本质是分组插入排序,也称为降序增量排序算法,因为DL. Shell 因 1959 年提出而得名。希尔排序是一种不稳定的排序算法。

    在上一篇《算法:排序算法的插入排序》中,优化方案中提到了使用希尔排序进行改进。希尔排序是基于插入排序的以下两个性质的改进方法:

    插入排序在对几乎已排序的数据进行操作时效率很高,即可以达到线性排序的效率,但插入排序一般效率较低,因为插入排序一次只能移动数据一位1.@ >基本思路

    先将整个待排序的元素序列分成若干个子序列(由以一定“增量”分隔的元素组成)进行直接插入排序,然后依次递减增量再排序,等待子序列中的元素整个序列当基本排序(增量足够小)时,对所有元素进行直接插入排序。

    因为直接插入排序在元素基本有序(接近最佳情况)的情况下效率很高,所以希尔排序比前两种方法在时间效率上的提升更大。

    2. 实现逻辑①首先取一个小于n的整数d1作为第一个增量,将文件的所有记录分成d1组。

    ②所有距离为d1倍数的记录放在同一个组中,在每个组内进行直接插入排序。

    ③取第二个增量d2小于d1,重复上述分组排序,直到增量dt=1(dt小于dt-l小于…小于d2小于d1)@ >,即所有记录放在同一个组中,直接插入排序。3.动画演示

    已知某二叉树的后序遍历序列是_已知有一个关键字序列_设计合成引物需要已知什么序列

    希尔排序

    具体来说,我们用一组数字来描述操作:

    已知某二叉树的后序遍历序列是_设计合成引物需要已知什么序列_已知有一个关键字序列

    假设有一组没有序列的 {9, 1, 2, 5, 7, 4, 8, 6, 3, 5}。

    第一次排序:设置gap1 = N / 2 = 5,即距离为5的元素组成一个组,可以分为5组。接下来,根据内联排序对每个组进行排序。

    二阶:

    将最后一个gap缩小一半,即gap2 = gap1 / 2 = 2(整数)。这样,相隔2距离的元素组成一个组,可以分为2组。根据内联排序对每个组进行排序。

    三阶:

    再次将间隙缩小一半,即gap3 = gap2 / 2 = 1。这样,相隔1距离的元素组成一个群,即只有一个群。根据内联排序对每个组进行排序。至此,排序结束。

    注意:需要注意的是图中有两个等值的元素5和5。我们可以清楚地看到,在排序过程中,两个元素的位置互换了。

    4. 性能分析平均时间复杂度:O(Nlog2N)

    最佳时间复杂度:

    最差时间复杂度:O(N^2)

    空间复杂度:O(1)@>

    稳定性:不稳定

    复杂性:更复杂

    希尔排序的效率取决于增量值差距的选择,时间复杂度不是一个固定值。

    开始时gap值较大,子序列中的元素个数较少,排序速度快,克服了直接插入排序的缺点;其次,gap值逐渐变小后,虽然子序列中的元素个数逐渐增加,但是大部分元素基本是有序的,因此继承了直接插入排序的优点,可以以近线性的速度排序.

    最优空间复杂度为起始元素已排序,则空间复杂度为0;最差的空间复杂度是起始元素被反向排序,那么空间复杂度是O(N);平均空间复杂度 Sorting for O(1)@> 希尔不只是相邻元素的比较,有很多跳跃比较已知有一个关键字序列,难免相同元素之间的相对位置会发生变化。例如,在上面例如,希尔排序等于数据5交换位置,所以希尔排序是一个不稳定的算法。

    5.代码实现

    C 版:

    // C实现
    void shell_sort(int arr[], int len) {
        int gap, i, j;
        int temp;
        for (gap = len >> 1; gap > 0; gap >>= 1)
            for (i = gap; i < len; i++) {
                temp = arr[i];
                for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
                    arr[j + gap] = arr[j];
                arr[j + gap] = temp;
            }
    }
    

    C++ 版本:

    // C++实现
    // 可以使用整数或浮点数作为元素,如果使用类(class)作为元素则需要重载大于(>)运算符。
    template<typename T>
    void shell_sort(T arr[], int len) {
        int gap, i, j;
        T temp;
        for (gap = len >> 1; gap > 0; gap >>= 1)
            for (i = gap; i < len; i++) {
                temp = arr[i];
                for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
                    arr[j + gap] = arr[j];
                arr[j + gap] = temp;
            }
    }
    

    Java 版本:

    6. 亮点(步骤(摘自维基百科)

    (6.1)@>步序

    步长的选择是希尔排序的重要组成部分。只要最后一步为 1,任何步骤序列都将起作用。该算法最初以一定的步长排序。然后它会继续按照一定的步长排序,最终算法会按照步长为1进行排序。当步长为1时,算法就变成了插入排序,保证了数据会被排序。

    作者最初的建议是对折再对折,直到最终步长为1。虽然这可以比O(n2)-like算法(插入排序)更好,但它仍然减少了平均时间和最坏时间余地。可能希尔排序最重要的一点是,在以较小步长进行排序时,之前使用的较大步长仍然按顺序排列。例如,如果一个序列以步长为 5 进行排序然后按步长3排序,那么序列不仅按步长3排序,而且按步长5排序。如果不是这样,那么算法会在迭代过程中打乱之前的顺序,那么它不会在这么短的时间内完成排序。

    (6.2)通用步序

    ①步序:n/2i 最坏情况复杂度:O(n2)

    ②步序:2k-1 最坏情况复杂度:O(n3/2)

    ③步序:2i3j 最坏情况复杂度:O(nlog2n)

    注意:由于显示特殊符号的问题,步序中的i、k-1、j等都是正确的上标符号。

    最著名的步长序列是由 Sedgewick (1, 5, 19, 41, 109,…) 提出的,其项为 9 x 4i – 9 x 2i + 1 和 2i+2 x ( 2i+2 -< @3)这两个公式。(注:公众号不能显示特殊符号,两个公式中的i、j等都是上标符号)

    1.4@>总结

    希尔排序通过将比较的所有元素分成几个区域,交换不相邻的元素对数组的部分进行排序,最后使用插入排序对部分排序的数组进行排序,从而提高了插入排序的性能。

    希尔排序的时间效应分析是困难的。键码的比较次数和记录动作的次数取决于增量因子序列d的选择。在某些情况下,可以准确估计键码的比较次数和记录的动作次数。目前还没有人给出选择最佳增量因子序列的方法。增量因子序列可以采取多种方式已知有一个关键字序列,包括奇数和素数,但需要注意的是增量因子中除了1之外没有公因子,并且最后一个增量因子必须为1。希尔排序方法是一种不稳定的排序方法。

    站内大部分资源收集于网络,若侵犯了您的合法权益,请联系我们删除!
    欧资源网 » 【每日一题】化学实验基本操作(2016.10.12)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论