归并排序

归并排序:

顾名思义,就是将要排序的一串数一分为二,递归的去排序左边和右边的数,最终合并到一起,以从小到大排序为例

参考代码:

 1 // Merge sort
 2 #include <iostream>
 3 using namespace std;
 4 void mergenum(int a[], int tmp[], int l, int mid, int r)
 5 {
 6     int i = l, j = mid+1, cnt = 0;
 7     while(i <= mid && j <= r)
 8     {
 9         if(a[i] < a[j]) tmp[cnt++] = a[i++];
10         else tmp[cnt++] = a[j++];
11     }
12     while(i <= mid) tmp[cnt++] = a[i++];
13     while(j <= r) tmp[cnt++] = a[j++]; // 两个循环将剩余数加入到临时数组里
14     for(int k = l,t = 0; k <= r; k++,t++) a[k] = tmp[t]; // 临时数组放入初始数组里
15 }
16 void msort(int a[], int tmp[], int l, int r)
17 {
18     if(l >= r) return;
19     int mid = (r-l)/2+l;
20     msort(a, tmp, l, mid); // 分割左边
21     msort(a, tmp, mid+1, r); // 分割右边
22     mergenum(a, tmp, l, mid, r); // 合并
23 }
24 void merge_sort(int a[], int n)
25 {
26     int tmp[n];
27     for(int i = 0; i < n; i++) tmp[i] = 0; // 提前创建一个临时数组,节省空间(据说是这样)
28     msort(a,tmp,0,n-1);
29 }
30 int main()
31 {
32     int a[] = {10,2,1,5,4,3,9,7,6,8};
33     const int n = 10;
34     merge_sort(a,n);
35     for(int i = 0; i < n; i++) cout << a[i] << " ";
36     return 0;
37 }

 

posted @ 2020-08-21 13:21  不敢说的梦  阅读(157)  评论(0)    收藏  举报