数组排序任务可以如下完成:
1) 把前一半排
2) 把后一半排序
3) 把两半归并到一个新的有序数组,然后再拷贝回
原数组,排序完成。
感悟:归并排序是一种分而治之的思想,就像是一个树从根部出来到叶子 再从叶子回到根部。要把归并排序和快速排序区别开来,其中最明显的不同就是归并排序是两个数组完成排序,而快速排序是一个数组完成任务。
在网上搜的这篇博客,讲的归并非常的详细且易于理解。但代码是JAVA代码。
http://www.cnblogs.com/chengxiao/p/6194356.html
//归并排序
#include<iostream>
using namespace std;
int a[10]={13,27,19,2,8,12,2,8,30,89};
int b[10];
void Merge(int a[],int l,int m,int h,int b[]){
int pb=0;
int p1=l,p2=m+1;
while(p1<=m&&p2<=h){
if(a[p1]>a[p2]){//判断大小,进行排序。
b[pb++]=a[p2++];
}else{
b[pb++]=a[p1++];
}
}
//下面是为了找齐所有的数字,因为可能存在
//最后有一个数组剩下大于一个的数
while(p1<=m){
b[pb++]=a[p1++];//
}
while(p2<=h){//
b[pb++]=a[p2++];//
}
for(int i=0;i<h-l+1;i++){
a[l+i]=b[i];
}
}
void MergeSort(int a[],int l,int h,int b[]){
if(l<h){//记住这个结束条件,要不然会死循环。
int m=l+(h-l)/2;
MergeSort(a,l,m,b);
MergeSort(a,m+1,h,b);
Merge(a,l,m,h,b);
}
}
int main(){
int size=sizeof(a)/sizeof(int);
MergeSort(a,0,size-1,b);
for(int i=0;i<size;++i){
cout<<a[i]<<endl;
}
return 0;
}