溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

何為希爾排序

發布時間:2021-10-13 16:06:32 來源:億速云 閱讀:188 作者:iii 欄目:編程語言

這篇文章主要講解了“何為希爾排序”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“何為希爾排序”吧!

概述

希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序算法。

希爾排序是基于插入排序的以下兩點性質而提出改進方法的:

  • 插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率;

這個結論很明顯,如果一個數組大部分元素都有序,那么數組中的元素自然不需要頻繁地進行比較和交換。

  • 在元素數量較少的情況下,插入排序的工作量較小

這個結論更加顯而易見,插入排序的工作量和n的平方成正比,如果n比較小,那么排序的工作量自然要小得多

也就是說:如果我們對數據做一些 “預處理”,使得原始數組的大部分元素變得有序,那么我們再使用插入算法進行排序,那么排序的效率將會大大提高。希爾排序正事基于這種思路實現的。

舉個栗子

這是我們現在拿到的原始數組: 何為希爾排序

第一輪,我們取總長度的一半,也就是4,作為跨度,這樣兩兩一組,總共事4組: 何為希爾排序

接下來,我們讓每組元素進行獨立排序,排序方式用直接插入排序即可。由于每一組的元素數量很少,只有兩個,所以插入排序的工作量很少。每組排序完成后的數組如下:

何為希爾排序

這樣一來,僅僅經過幾次簡單的交換,數組整體的有序程度得到了顯著提高,使得后續再進行直接插入排序的工作量大大減少。這種做法,可以理解為對原始數組的“粗略調整”。 但是這樣還不算完,我們可以進一步縮小分組跨度,重復上述工作。把跨度縮小為原先的一半,也就是跨度為2,重新對元素進行分組,一共兩組: 何為希爾排序

接下來,我們繼續讓每組元素進行獨立排序,排序方式用直接插入排序即可。每組排序完成后的數組如下:

何為希爾排序

最后,我們把分組跨度進一步減小,讓跨度為1,也就等同于做直接插入排序。經過之前的一系列粗略調整,直接插入排序的工作量減少了很多,排序結果如下:

何為希爾排序

讓我們重新梳理一下分組排序的整個過程:

何為希爾排序

代碼實現:

    public static int[] sort(int[] arr) {
        if (arr.length < 2) {
            return arr;
        }
        int step = arr.length / 2;
        for (; step > 0; step /= 2) {
            for (int i = step; i < arr.length; i++) {
                int temp = arr[i];
                int j = i;
                for (; j >= step && temp < arr[j - step]; j -= step) {
                    //符合條件往后移
                    arr[j] = arr[j - step];
                }
                arr[j] = temp;
            }
        }
        return arr;
    }

感謝各位的閱讀,以上就是“何為希爾排序”的內容了,經過本文的學習后,相信大家對何為希爾排序這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女