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