演算法 希爾排序

2022-08-01 09:33:13 字數 857 閱讀 1575

希爾排序(shell sort)是插入排序的一種更高效的改進版本。他是通過比較相距一定間隔的元素來工作,各趟比較所用距離隨著演算法的進行而減小,直至只比較相鄰元素的最後一趟排序,因此也稱遞減增量排序演算法。

直接插入排序在當序列恰好為順序時,時間消耗為o(n),因此若某個序列已基本有序,直接插入排序的效率就會提高。

希爾排序使用乙個序列h1,h2...ht的增量序列,只要h1=1,任何序列都是可行的。

選擇不同的排序序列的效能不同,這裡我們使用shell建議的序列:h(t)=n/2,h(k)=h(k+1)/2

使用增量hk進行的一趟排序之後,對於∀i∈[0,n],都有a[i]<=a[i+hk],含義就是相隔hk的元素已經排好序。

時間複雜度與增量序列有關,但複雜度小於o(n^2),同時希爾排序也是不穩定的排序演算法

,這是顯然的,由於間隔的步長不一樣,可能將某個元素插入到相同元素前面。

按照增量dlta對陣列進行排序,相隔dlta的元素已經排好序,和直接插入排序基本一樣。

public void insertdlta(int arr, int dlta) 

arr[j + dlta] = key;

}}

於是希爾排序的演算法為

public void shellsort(int array, int reductionfactor) 

}

public static void main(string args) ;

shellsort(array, 2);

for (int i : array)

}

輸出

4 13 27 38 49 49 55 65 76 97

排序演算法 希爾排序

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

排序演算法 希爾排序

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

排序演算法 希爾排序

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