希尔排序之C++实现(高级版)

希尔排序之C++实现(高级版)

一、源代码:ShellSortHigh.cpp

 1 /*希尔排序基本思想:
 2 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。
 3 所有距离为d1的倍数的记录放在同一个组中。
 4 先在各组内进行直接插入排序;
 5 然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量  =1(<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
 6 */
 7 #include<iostream>
 8 using namespace std;
 9 /*定义输出一维数组的函数*/
10 void print(int array[], int n)
11 {
12     for (int i = 0; i < n; i++)
13     {
14         cout << array[i] << " ";
15     }
16     cout << endl;
17 }
18 /*
19 一种查找比较操作和记录移动操作交替地进行的方法。
20 具体做法:
21  将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i-1,i-2,…,1)的关键字进行比较:
22   ① 若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置;
23   ②若R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j+1即为R[i]的插入位置。
24    关键字比R[i]的关键字大的记录均已后移,所以j+1的位置已经腾空,只要将R[i]直接插入此位置即可完成一趟直接插入排序。
25 
26    */
27 int shellSort(int array[], int n)
28 {
29     //定义变量,记录交换次数
30     int count = 0;
31     //定义中间变量,做为临时交换变量
32     int temp;
33     //遍历数组(进行排序)
34     cout << "开始对数组进行排序了..." << endl;
35     //定义初始增量值
36     int gap = n;
37     do{
38         //初始增量变化规律
39         gap = gap / 3 + 1;
40         for (int i = gap; i < n; i++)
41         {
42             for (int j = i; j >= gap; j-=gap)
43             {
44                 if (array[j] < array[j - gap])
45                 {
46                     temp = array[j];
47                     array[j] = array[j - gap];
48                     array[j - gap] = temp;
49                     cout << array[j] << "" << array[j - gap] << "互换了" << endl;
50                     //输出此时数组的顺序
51                     cout << "数组此时的顺序是:";
52                     print(array, 10);
53                     //每交换一次,记录数加1
54                     count++;
55                 }
56                 else
57                 {
58                     break;
59                 }
60             }
61         }
62     } while (gap>1);
63     cout << "数组排序结束了..." << endl;
64     return count;
65 }
66 
67 int main()
68 {
69     //定义待排序的一维数组
70     int array[] = { 1, 3, 4, 5, 2, 6, 10, 9, 8, 7 };
71     //输出原始数组
72     cout << "原始数组是:" << endl;
73     print(array, 10);
74     //对数组进行排序
75     int count = shellSort(array, 10);
76     //输出排序后的数组
77     cout << "排序后的数组是:" << endl;
78     print(array, 10);
79     cout << "共交换" << count << "" << endl;
80     return 0;
81 }

二、运行效果

 

原文地址:https://www.cnblogs.com/zfc-java/p/7396429.html