归并排序(分治)
经典的排序算法,经典的分治策略。
重点在于Merge函数对两部分已排序数组的合并。注意使用哨兵牌技巧。
1 /* 2 * 归并排序 3 */ 4 int helper_1[10005]; 5 int helper_2[10005]; 6 void merge(int arr[], int p, int q, int r) 7 { 8 int i = 0, j = 0; 9 for (i = p; i <= q; i++) 10 helper_1[i] = arr[i]; 11 for (j = q + 1; j <= r; j++) 12 helper_2[j] = arr[j]; 13 helper_1[q + 1] = INF; // 设置哨兵牌 14 helper_2[r + 1] = INF; // 设置哨兵牌 15 i = p; j = q + 1; // 指针设置为初始状态 16 for (int k = p; k <= r; k++) 17 { 18 if (helper_1[i] >= helper_2[j]) { 19 arr[k] = helper_2[j]; 20 j++; 21 } 22 else { 23 arr[k] = helper_1[i]; 24 i++; 25 } 26 } 27 } 28 // 归并排序 29 void mergeSort(int arr[], int p, int r) 30 { 31 if (p < r) { 32 int mid = (p + r) >> 1; 33 mergeSort(arr, p, mid); 34 mergeSort(arr, mid + 1, r); 35 merge(arr, p, mid, r); 36 } 37 } 38 int main() 39 { 40 int ar[20]; 41 srand((unsigned)time(nullptr)); 42 for (int i = 0; i <= 19; i++) 43 ar[i] = rand() % (10 - 1 + 1) + 1; 44 mergeSort(ar, 0, 19); 45 // 打印 46 for (int i = 0; i <= 19; i++) 47 cout << ar[i] << " "; 48 return 0; 49 }