4.归并排序
1 #include "pch.h"
2 #include <iostream>
3 void Sort(int arr[],int lo, int mid,int hi) {
4 int i, j, k;
5 int n1 = mid - lo + 1;
6 int n2 = hi - mid;
7 int *A = new int[n1 + 1];
8 int *B = new int[n2 + 1];
9 for (i = 0; i < n1; i++) { //暂存左路所有元素,以此临时数组做归并
10 A[i] = arr[lo+i];
11 }
12 for (j = 0; j < n2; j++) { //暂存右路所有元素
13 B[j] = arr[mid+j+1];
14 }
15 A[n1] = 100000; //哨兵,假设归并数组的尾位置(实际不存在)无穷大!
16 B[n2] = 100000;
17 //两路归并
18 for (i = 0, j = 0, k = lo; k <= hi; k++)
19 {
20 if (A[i] <= B[j])
21 {
22 arr[k] = A[i];
23 i++;
24 }
25 else {
26 arr[k] = B[j];
27 j++;
28 }
29 }
30 delete[] A;
31 delete[] B;
32
33 }
34 void mergeSort(int arr[], int lo, int hi) {
35 if (lo < hi)
36 {
37 int mid = (hi+lo) / 2; //注意这里计算的时候是数组的中点秩而不是距离
38 mergeSort(arr, lo, mid); //左路
39 mergeSort(arr, mid + 1, hi); //右路
40 Sort(arr, lo, mid, hi); //左右合并
41 }
42 }
43 int main() {
44 int a[8] = { 4,2,3,7,6,9,8,5 };
45 mergeSort(a,0,7);
46 for (int k = 0; k < 8; k++) {
47 std::cout << a[k] << " ";
48 }
49 }