归并排序
并归排序就是将两个有序数组合成一个有序数组。
所以需要先写一个合并数组的函数merge()来合并两个有序数组。这个函数应该没有问题,但如何得到两个有序数组呢?。。。。仔细想一下,得到两个有序数组的不就是分别对这两个数组归并排序吗?那么数组的数组怎么得到?任然是归并排序,直到数组中只剩下一个值了,就不用排序了,这又是一个递归过程。要想排序这数组,就先排序它的小数组,排序小数组,就先排序小小数组。。。所以我们应该先递归到数组只剩一个值了,然后再一层一层的合并数组,直到整个数组合并完成。
#include"iostream" using namespace std; void show(int *a,int n){ for(int i = 0;i < n;i++){ cout<<a[i]<<ends; } cout<<endl; } void merge(int *a,int *b,int l,int center,int rend){ int lend = center,r = center + 1,l1 = l,i = l; while(l <= lend && r <= rend){ if(a[l] < a[r]){ b[i++] = a[l++]; } else{ b[i++] = a[r++]; } } while(l <= lend){ b[i++] = a[l++]; } while(r <= rend){ b[i++] = a[r++]; } for(int j = l1;j < i;j++){ a[j] = b[j]; } } void mSort(int *a,int *b,int l,int r){ if(l < r){ int center = (l + r) / 2; mSort(a,b,l,center); mSort(a,b,center + 1,r); merge(a,b,l,center,r); //合并 } } void mergeSort(int *a,int n){ int *b = new int[n]; //这里申请一个临时数组来存小数组,避免后面频繁申请内存 mSort(a,b,0,n - 1); delete []b; } int main(){ const int n = 10; int a[n]; for(int i = 0;i < n;i++){ a[i] = n - i; } show(a,n); mergeSort(a,n); show(a,n); return 0; }
BY oleolema