排序算法——希爾排序

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


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


  1. 插入排序在對幾乎已經排好序的數據操做時,效率高,便可以達到線性排序的效率。web

  2. 但插入排序通常來講是低效的,由於插入排序每次只能將數據移動一位。算法

希爾排序動畫演示

數組由{7, 3, 1, 9, 5, 4, 2, 8, 6} 這9個無序元素組成。shell


第一次:gap = 9/2 = 4 動畫:數組


第二次:gap = 4/2 = 2 動畫:微信


第三次:gap = 2/2 = 1 動畫:app


代碼以下:學習

public class ShellSortTest2 {
public static void main(String[] args{
    int[] arr = new int[] {731954286};
    shellSort(arr);
}

public static void shellSort(int[] arr{
    // 增量gap,經過gap來劃分出不一樣的子序列,gap不斷減小,劃分的子序列更多
    for (int gap = arr.length / 2; gap > 0; gap /= 2) { // 循環獲得不一樣的gap,gap = 4, 2, 1
        System.out.println("gap: " + gap);

        for (int i = gap; i < arr.length; i++) { // 每組使用插入排序
            for (int j = i; j-gap >= 0; j -= gap) {
                if (arr[j-gap] > arr[j]) {
                    swap(arr, j-gap, j);
                    System.out.print("\t交換: " + arr[j-gap] + "和" + arr[j]);
                    System.out.println(Arrays.toString(arr));
                }
            }
        }
    }
}

public static void swap(int[] arr, int start, int end{
    int temp = arr[start];
    arr[start] = arr[end];
    arr[end] = temp;
}
}




本文分享自微信公衆號 - Java學習進階手冊(javastudyup)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。動畫

相關文章
相關標籤/搜索