006-排序算法-希爾排序

1、概述java

  希爾排序(Shell's Sort)是插入排序的一種又稱「縮小增量排序」(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因D.L.Shell於1959年提出而得名。 git

排序方法 時間複雜度(平均) 時間複雜度 (最壞) 時間複雜度(最好) 空間複雜度 穩定性 使用場景
希爾排序 O(N*(logN)2) O(n2) O(nlogn) O(n) 不穩定 中等數據規模

1.一、算法說明github

  首先它把較大的數據集合分割成若干個小組(邏輯上分組),而後對每個小組分別進行插入排序,此時,插入排序所做用的數據量比較小(每個小組),插入的效率比較高算法

    

  能夠看出,他是按下標相隔距離爲4分的組,也就是說把下標相差4的分到一組,好比這個例子中a[0]與a[4]是一組、a[1]與a[5]是一組...,這裏的差值(距離)被稱爲增量shell

    

  每一個分組進行插入排序後,各個分組就變成了有序的了(總體不必定有序)數組

    

  此時,整個數組變的部分有序了(有序程度可能不是很高)spa

    

  而後縮小增量爲上個增量的一半:2,繼續劃分分組,此時,每一個分組元素個數多了,可是,數組變的部分有序了,插入排序效率一樣比高.net

    

  同理對每一個分組進行排序(插入排序),使其每一個分組各自有序3d

    

  

  最後設置增量爲上一個增量的一半:1,則整個數組被分爲一組,此時,整個數組已經接近有序了,插入排序效率高code

    

1.二、代碼實現

    public static void shellSort(int[] a) {
        //希爾排序
        int d = a.length;
        while (true) {
            d = d / 2;
            for (int x = 0; x < d; x++) {
                for (int i = x + d; i < a.length; i = i + d) {
                    int temp = a[i];
                    int j;
                    for (j = i - d; j >= 0 && a[j] > temp; j = j - d) {
                        a[j + d] = a[j];
                    }
                    a[j + d] = temp;
                }
            }
            if (d == 1) {
                break;
            }
        }
    }

代碼地址:地址 中的algorithm-001-sort中 ShellSort  

參看地址:https://blog.csdn.net/qq_39207948/article/details/80006224

  https://baike.baidu.com/item/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F/3229428?fr=aladdin

相關文章
相關標籤/搜索