希爾排序之C++實現(初級版)


希爾排序之C++實現(初級版)

一、源代碼:希爾排序之C++實現(初級版)

 1 /*希爾排序基本思想:
 2 先取一個小於n的整數d1作為第一個增量,把文件的全部記錄分組。
 3 所有距離為d1的倍數的記錄放在同一個組中。
 4 先在各組內進行直接插入排序;
 5 然后,取第二個增量d2<d1重復上述的分組和排序,直至所取的增量  =1(<…<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。*/
 6 #include<iostream>
 7 using namespace std;
 8 /*定義輸出一維數組的函數*/
 9 void print(int array[], int n)
10 {
11     for (int i = 0; i < n; i++)
12     {
13         cout << array[i] << " ";
14     }
15     cout << endl;
16 }
17 
18 int shellSort(int array[], int n)
19 {
20     //定義變量,記錄交換次數
21     int count = 0;
22     //定義中間變量,做為臨時交換變量
23     int temp;
24     int j;
25     //遍歷數組(進行排序)
26     cout << "開始對數組進行排序了..." << endl;
27     //定義初始增量值
28     int gap = n;
29     do{
30         //初始增量變化規律
31         gap = gap / 3 + 1;
32         for (int i = gap; i < n; i++)
33         {
34             //當左邊元素大於右邊元素時
35             if (array[gap] < array[i - gap])
36             {
37                 //將當前的數組元素存儲到臨時變量中
38                 temp = array[i];
39                 //將從i位置(比temp大的元素)開始的數組元素整體后移
40                 for (j = i - gap; j >= 0 && array[j]>temp; j -= gap)
41                 {
42                     cout << array[j] << "" << array[j + gap] << "互換了" << endl;
43                     //將數組中的元素整體后移一個單位
44                     array[j + gap] = array[j];
45                     //輸出此時數組的順序
46                     cout << "數組此時的順序是:";
47                     print(array, 10);
48                     //每交換一次,記錄數加1
49                     count++;
50                 }
51                 array[j + gap] = temp;
52             }
53         }
54     } while (gap > 1);
55     cout << "數組排序結束了..." << endl;
56     return count;
57 }
58 
59 int main()
60 {
61     //定義待排序的一維數組
62     int array[] = { 1, 3, 4, 5, 2, 6, 10, 9, 8, 7 };
63     //輸出原始數組
64     cout << "原始數組是:" << endl;
65     print(array, 10);
66     //對數組進行排序
67     int count = shellSort(array, 10);
68     //輸出排序后的數組
69     cout << "排序后的數組是:" << endl;
70     print(array, 10);
71     cout << "共交換" << count << "" << endl;
72     return 0;
73 }

二、運行效果

 


免責聲明!

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



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