高效排序算法-希爾排序

原理

希爾排序也屬于插入類(lèi)排序算法。希爾排序通過(guò)縮小增量,將待排元素劃分為若干個(gè)子序列,分別對(duì)每個(gè)子序列按照直接插入排序算法進(jìn)行排序。當(dāng)增量為1時(shí),待排序元素構(gòu)成一個(gè)子序列,對(duì)該序列排序完畢后希爾排序結(jié)束?!?/p>

為了減少數(shù)據(jù)的移動(dòng)次數(shù),在初始序列較大時(shí)取較大的步長(zhǎng),通常取序列長(zhǎng)度的一半,此時(shí)只有兩個(gè)元素比較,交換一次;之后步長(zhǎng)依次減半直至步長(zhǎng)為1,即為插入排序,由于此時(shí)序列已接近有序,故插入元素時(shí)數(shù)據(jù)移動(dòng)的次數(shù)會(huì)相對(duì)較少,效率得到了提高。

/**
 * shell排序
 * @param a
 * @return
 */
public static int[] shellSort(int[] a){
    int N = a.length;
    int h = 1;
    // 增量序列
    while(h < N/3){
        // h = 1,4,13,40,……
        h = h*3 + 1; 
    }

    while(h>=1){
        for (int i = h; i < N; i++) {
            // 進(jìn)行插入排序,諾a[j]比a[j-h]小,則向前挪動(dòng)h
            for (int j = i; j >= h && a[j-h]>a[j]; j -= h) {
                exc(a, j, j-h);
            }
        }
        h /= 3;
    }
    return a;
}

希爾排序的理念和梳排序的理念有點(diǎn)類(lèi)似。在梳排序中,我們比較距離相差為step的兩個(gè)元素來(lái)完成交換。在希爾排序中,我們的做法也是類(lèi)似。我們?cè)跀?shù)組中每隔h取出數(shù)組中的元素,然后進(jìn)行插入排序。當(dāng)h=1時(shí),則就是前面所寫(xiě)的插入排序了。

實(shí)例
流程圖

時(shí)間復(fù)雜度:通常認(rèn)為是O(N3/2) ,未驗(yàn)證  穩(wěn)定性:不穩(wěn)定

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容