希爾排序之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 }
二、運行效果