希尔排序

直接插入排序适用于基本有序的排序表和数据量不大的排序表。

希尔排序(Shell)又叫缩小增量排序

基本思想如下:

-设待排序列有n个元素,取一整数gap(gap<n)作为间隔,将全部元素分为gap个子序列,所有距离为gap的元素放在同一个子序列中
-在每一个子序列中分别采用直接插入排序
-然后缩小间隔gap,例如取gap = gap/2,重复上述的子序列划分和排序工作
-直到最后取gap = 1,将所有元素放在同一个序列中排序为止

 

代码如下

 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 }

运行结果如下:

 

 

posted @ 2018-07-26 08:59  nullxjx  阅读(545)  评论(0编辑  收藏  举报