希爾排序【代碼】

直接插入排序適用於基本有序的排序表和數據量不大的排序表。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

 

相關文章
相關標籤/搜索