排序演算法 希爾排序

2021-08-17 00:19:12 字數 1648 閱讀 2352

希爾排序是希爾(donald shell)於2023年提出的一種排序演算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的乙個更高效的版本,也稱為縮小增量排序,同時該演算法是衝破o(n^2)的第一批演算法之一。本文會以**的方式詳細介紹希爾排序的基本思想及其**實現。

簡單插入排序很循規蹈矩,不管陣列分布是怎麼樣的,依然一步一步的對元素進行比較,移動,插入,比如[5,4,3,2,1,0]這種倒序序列,陣列末端的0要回到首位置很是費勁,比較和移動元素均需n-1次。而希爾排序在陣列中採用跳躍式分組的策略,通過某個增量將陣列元素劃分為若干組,然後分組進行插入排序,隨後逐步縮小增量,繼續按組進行插入排序操作,直至增量為1。希爾排序通過這種策略使得整個陣列在初始階段達到從巨集觀上看基本有序,小的基本在前,大的基本在後。然後縮小增量,到增量為1時,其實多數情況下只需微調即可,不會涉及過多的資料移動。

我們來看下希爾排序的基本步驟,在此我們選擇增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇我們可以用乙個序列來表示,,稱為增量序列。希爾排序的增量序列的選擇與證明是個數學難題,我們選擇的這個增量序列是比較常用的,也是希爾建議的增量,稱為希爾增量,但其實這個增量序列不是最優的。此處我們做示例使用希爾增量。

在希爾排序的理解時,我們傾向於對於每乙個分組,逐組進行處理,但在**實現中,我們可以不用這麼按部就班地處理完一組再調轉回來處理下一組(這樣還得加個for迴圈去處理分組)比如[5,4,3,2,1,0] ,首次增量設gap=length/2=3,則為3組[5,2] [4,1] [3,0],實現時不用迴圈按組處理,我們可以從第gap個元素開始,逐個跨組處理。同時,在插入資料時,可以採用元素交換法尋找最終位置,也可以採用陣列元素移動法尋覓。希爾排序的**比較簡單,如下:

public

static

void

main(string args) ;

shellsort1(arr);

showarr(arr);

//1 2 3 4 5 6 7 9 10

} //希爾排序

public

static

void

shellsort1(int arr)}}

}public

static

void

shellsort2(int arr)

}arr[j]=temp; }}

}

時間複雜度與插入排序相同,都是o(n^2),希爾排序是不穩定的排序演算法。雖然一次插入排序是穩定的,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後打亂穩定性。

效果最好,秒殺所有o(n^2)的排序演算法。所在資料量較小的場景下,如100000個元素以下,都可考慮希爾排序

排序演算法 希爾排序

如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...

排序演算法 希爾排序

摘要 排序演算法有很多,最簡單的有氣泡排序和插入排序,這兩種方法都具有o n 2 的時間界.我們想要討論的是具有更好的時間界的排序演算法,比如希爾排序.1 希爾排序的思路是通過比較一定間距的元素來進行排序,最後再對所有相鄰元素進行一次插入排序.2 希爾排序最重要的引數是增量序列 h1,h2,ht 只...

排序演算法 希爾排序

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,...