直接插入排序適用於基本有序的排序表和數據量不大的排序表。ios
希爾排序(Shell)又叫縮小增量排序shell
基本思想以下:數組
-設待排序列有n個元素,取一整數gap(gap<n)做爲間隔,將所有元素分爲gap個子序列,全部距離爲gap的元素放在同一個子序列中
-在每個子序列中分別採用直接插入排序
-而後縮小間隔gap,例如取gap = gap/2,重複上述的子序列劃分和排序工做
-直到最後取gap = 1,將全部元素放在同一個序列中排序爲止dom
代碼以下測試
1 // shell排序.cpp: 定義控制檯應用程序的入口點。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <random> 7 8 using namespace std; 9 10 #define LENGTH(a) (sizeof(a)/sizeof(a[0]))//獲取數組維度 11 12 int Shell_sort(int *A, int n) 13 { 14 int key,j; 15 for (int dk = n / 2; dk >= 1; dk /= 2)//dk爲每次排序子序列的間隔 16 { 17 for (int i = dk; i < n; i++) 18 { 19 if (A[i] < A[i - dk])//按升序排列 20 { 21 key = A[i]; 22 j = i - dk; 23 while (j >= 0 && A[j] > key) 24 { 25 A[j + dk] = A[j]; 26 j -= dk; 27 } 28 A[j + 1] = key; 29 } 30 } 31 } 32 return 0; 33 } 34 35 int main() 36 { 37 default_random_engine e; 38 uniform_int_distribution<unsigned> u(0, 100);//便於測試方便,之後的數據所有用隨機數 39 int test[15] = { 0 }; 40 for (int i = 0; i < 15; i++) 41 { 42 test[i] = u(e); 43 } 44 cout << "排序以前的數組序列: "; 45 for (auto c : test) 46 cout << c << ends; 47 cout << endl; 48 49 Shell_sort(test, LENGTH(test)); 50 51 cout << "排序以後的數組序列: "; 52 for (int i = 0; i < LENGTH(test); i++) 53 { 54 cout << test[i] << ends; 55 } 56 cout << endl; 57 return 0; 58 }
運行結果以下:spa