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 }

猜你喜欢

转载自www.cnblogs.com/Royzzzzz/p/11841665.html