Java 詳解希爾(Shell)排序__Java

來源:互聯網
上載者:User

      最近找工作,做筆試題考到排序演算法,重溫一下希爾排序,第一遍在看的時候竟然沒理解。。。 ⊙﹏⊙b汗 所以把自己在看第一遍代碼時候遇到的問題加以整理,以防再忘,一定不能再忘了。。

     希爾排序(縮小增量法) 屬於插入類排序,是將整個無序列分割成若干小的子序列分別進行插入排序。希爾排序並不穩定,O(1)的額外空間,時間複雜度為O(N*(logN)^2)。最壞的情況下的執行效率和在平均情況下的執行效率相比相差不多。

    希爾排序間隔序列函數 h = h * 3+ 1

    希爾排序比插入排序快很多的原因:當h值很大時,資料項目每一趟排序移動的元素個數少,但移動的距離很長,這是非常高效的;當h值減小時,每一趟排序移動的元素個數增加,但此時的資料項目已經接近於他們最終排序後的位置,插入排序可以更有效


直接附代碼

public class ShellSort {static void sort(int[] array) {int out, in, tmp;int len = array.length;int h = 1; while(h < len / 3) // 計算間隔h最大值h = h * 3 + 1;while(h > 0){ // 能否繼續通過縮小間隔h來分割資料列的判定/* * out為什麼從h開始。你分割後的第一子序列應該是這樣一個序列,0, h, 2h, 3h, ... * 插入排序的while迴圈是從1開始的,因為第一個數始終有序,不需要比較,這個需要瞭解插入排序的演算法,所以比較是從第二個資料線,就是數組的第h個下標開始 * out的判定為什麼是out < len。 * 控制數組下標,下面的例子會說道 *  * 下面舉一個例子來解釋 * 假定有一個10個資料項目的數組,數組下標從0 ~ 9 表示 * 當h = 4時的子序列情況是這樣的,以下標表示 * (0 4 8)(1 5 9)(2 6)(3 7) * 我第一次是這麼理解的,真對每一組分別進行插入排序(當然也可以這樣實現,但是下標不好控制),但是對下面的代碼來說這是錯誤的理解。 * 正確的過程是這樣的,外層for迴圈每次對每一分組的前兩個資料項目進行插入排序,然後前3個,然後前4個 ... 這個和子序列個數有關 * 排序過程只真對方括弧進行 * 當out = 4時進行如下過程 ([0 4] 8) * 當out = 5時([1 5] 9) * 當out = 6時([2 6]) * 當out = 7時([3 7]) * 當out = 8時([0 4 8]) * 當out = 9時([1 5 9]) * h = 4執行完畢,然後h = (h - 1) / 3 = 1開始新的for迴圈 * h = 1時執行過程和h = 4時一樣,不過這時的子數列就是原始的數列,蛻變為一個簡單的插入排序,這是數組基本有序,資料項目移動次數會大大減少 *  */for(out = h; out < len; out++){ // 外層通過out確定每組插入排序的第二個資料項目// 以下代碼就是對子序列進行的插入排序演算法tmp = array[out];in = out;/* * 比較插入排序while迴圈的寫法,這裡的while迴圈與h有關,所以判定就與h有關,包括 in -= h語句 * while(in > 0 && array[in - 1] > tmp){ * array[in] = array[in - 1]; * in--;     * }     * array[in] = tmp; *  */while(in > h -1 && array[in - h] >= tmp){array[in] = array[in - h];in -= h;}array[in] = tmp;//for(int i = 0; i < len; i++)//System.out.print(array[i] + " ");//System.out.println();}// 縮小間隔h = (h - 1) / 3;}}}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.