c++實現希爾排序
阿新 • • 發佈:2018-12-23
希爾排序(Shell Sort),也稱為遞減增量排序演算法,是插入排序的一種高速而穩定的改進版本。希爾排序是基於插入排序的以下兩點性質而提出改進方法的:1.插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率;2.但插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位。
希爾排序的一般步驟為:
1.先取一個小於n的整數d1作為第一個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同一個組中,在各組內進行直接插人排序。
2.取第二個增量d2<d1重複上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。
步長的選擇是希爾排序的重要部分。只要最終步長為1任何步長序列都可以工作。演算法最開始以一定的步長進行排序。然後會繼續以一定步長進行排序,最終演算法以步長為1進行排序。當步長為1時,演算法變為插入排序,這就保證了資料一定會被排序。
平均時間複雜度:O(nlogn)
穩定性:不穩定
//希爾排序是直接插入排序的改進,它的插入增量可以變化,增量為2的shell排序的時間代價可以達到θ(n的3/2次方),有的增量可以達到θ(n的7/6次方),很接近θ(n)。 //將距離某個增量的子序列分割後,分別進行直接插入排序排序。 #include <iostream> using namespace std; void ShellSort(int array[], int n) { int i, j; int increment = n; do { increment = increment / 3 + 1;//增量序列 for (i = increment + 1; i <= n; i++) { if (array[i] < array[i - increment]) { array[0] = array[i]; for (j = i - increment; j>0 && array[0] < array[j]; j -= increment) array[j + increment] = array[j]; array[j + increment] = array[0]; } } } while (increment>1); } void main() { int arr[10]; cout << "請輸入要排序的元素:" << endl; for (int i = 0; i < 10; i++) { cin >> arr[i]; } //cout << "排序前的無序陣列元素" << arr[i] << endl; ShellSort(arr, 10); cout << "排序後的陣列元素" << endl; for (int i = 0; i < 10; i++) { cout << arr[i] << endl; } system("pause"); }