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

    插入排序的一个不错改进。与梳排序类似,希尔排序也用到gap的概念。

    基本思路是:将原先的一行元素以gap为分界分成几段排成几行,然后按列来用插入排序。不断缩小gap直至1.

    代码中用到的一个小优化是维基上看到的,据说此比率效率较高,由Knuth提出。

    另外,还有一个优化基于下面的观察。

    按照常规思路来说,对于每一个gap,我们应该分别对每一列来做插入排序。但是很显然,不同列之间是不会相互干扰的,因此,在代码中直接从第一列第二个元素开始递增,不断做插入排序。相邻的元素位于不同的列,因此它们并不会影响到彼此,对于同一列的元素,在这一列两个元素之间做了其他什么运算并没影响。这样写代码更加简洁。

    public static void shellSort(int[] A){
        int gap = 1;
        while(gap < A.length/3)
            //by Knuth
            gap = gap * 3 + 1;
        for(; gap >= 1; gap /= 3){
            for(int i = gap; i < A.length; i ++){
                for(int j = i-gap; j >= 0 && A[j] > A[j+gap]; j -= gap){
                    swap(A, j, j+gap);
                }
            }
        }
    }
    Java
  • 相关阅读:
    快速幂 快速乘法
    扩展欧几里得学习笔记
    求逆序数数目(树状数组+离散化)
    隐式图的遍历
    随机数生成
    推倒重来
    动态规划初步
    子集生成
    东大oj1155 等凹函数
    P1278 单词游戏
  • 原文地址:https://www.cnblogs.com/7hat/p/3381414.html
Copyright © 2011-2022 走看看