https://www.cnblogs.com/chengxiao/p/6194356.html
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
分而治之
可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。
合并相邻有序子序列
再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。
根据剑指offer面试题51 写出一个递归的归并排序如下:
#include<iostream>
#include<algorithm>
#include<string.h>
void merge(int* a,int* b,int start,int mid,int end){
int i=start;
int j=mid+1;
int index = start;
while(i<=mid && j<=end){
if(a[i]<=a[j])
b[index++]=a[i++];
else
b[index++]=a[j++];
}
while(i<=mid)
b[index++]=a[i++];
while(j<=end)
b[index++]=b[j++];
}
void merge_sort(int* a,int* b,int start,int end){
if(start<end){
std::cout<<"before";
for(int i=0;i<9;i++)
std::cout<<b[i]<<' ';
std::cout<<std::endl;
int mid = (end-start)/2+start;
merge_sort(b,a,start,mid); //left sort
merge_sort(b,a,mid+1,end);//right sort
merge(a,b,start,mid,end);
std::cout<<"after ";
for(int i=0;i<9;i++)
std::cout<<b[i]<<' ';
std::cout<<std::endl;
}
}
int main(){
int a[9]={5,3,1,7,9,6,2,4,8};
int* b = new int [sizeof(a)/sizeof(int)];
memcpy(b,a,sizeof(a));
merge_sort(a,b,0,8);
std::cout<<"Final ";
for(int i=0;i<sizeof(a)/sizeof(int);i++)
std::cout<<b[i]<<' ';
return 0;
}
递归和非递归实现方式
https://www.cnblogs.com/bluestorm/archive/2012/09/06/2673138.html
https://blog.csdn.net/chencangui/article/details/44680113/