希尔排序
直接插入排序适用于基本有序的排序表和数据量不大的排序表。
希尔排序(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 }
运行结果如下:
只有0和1的世界是简单的