希爾排序之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 }

二、運行效果

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM