1. 程式人生 > 其它 >插入排序java_插入排序與希爾排序Java版

插入排序java_插入排序與希爾排序Java版

技術標籤:插入排序java

插入排序

時間複雜度:O(n²)

插入排序(Insertion Sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用 in-place 排序(即只需用到 O(1) 的額外空間的排序),因而在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。——維基百科
public void sort(int[] data) {
    int tmp;
    int j;
    for (int p = 1; p < data.length; p++) {
        tmp = data[p];
        for (j = p; j > 0 && data[j - 1] > tmp; j--) {
            data[j] = data[j - 1];
        }
        data[j] = tmp;
    }
}

希爾排序

原始的演算法實現在最壞的情況下需要進行 O(n2) 的比較和交換。優化後效能提升至 O(n log2 n)。這比最好的比較演算法的 O(n log n) 要差一些。

該演算法是衝破二次時間屏障的第一批演算法之一。
希爾排序有時也叫做縮小增量排序(diminishing increment sort)。
希爾排序使用一個序列 h1,h2,h3,...ht,叫做增量序列(increment sequence),只要 h1 = 1,任何增量序列都是可行的。

public void sort(int[] array) {
    int number = array.length / 2;
    int i;
    int j;
    int temp;
    while (number >= 1) {
        for (i = number; i < array.length; i++) {
            temp = array[i];
            j = i - number;
            while (j >= 0 && array[j] > temp) {
                array[j + number] = array[j];
                j = j - number;
            }
            array[j + number] = temp;
        }
        number = number / 2;
    }
}

使用不同的增量序列時間複雜度也都各不相同。

如果覺得還不錯的話,歡迎關注我的公眾號,我會不定期發一些乾貨~

a2842c8a51baff7e22675c125b948d30.png
公眾號

也可以加我微信:

85da2f77c9379e3c8150f174371fabbc.png
個人微信