/*
归并排序:用分治法,对要排序的数组一分为二,对每个子数组依然一分为二,直到数组中只有一个元素为止;然后将相邻两个数组进行合并
如:
3,98,43,9,36,45,2,7
拆分:要排序的数组一分为二,对每个子数组依然一分为二,直到数组中只有一个元素,数组就是有序的
第一次拆分:3,98,43,9 36,45,2,7
第二次拆分:3,98 43,9 36,45 2,7
第三次拆分:3 98 43 9 36 45 2 7
合并:对有序的数组用一个新的数组将两个子数组进行合并
第一次合并:3,98 9,43 36,45 2,7
第一次合并:3,9,43,98 2,7,36,45
第一次合并:2,3,7,9,36,43,45,98
*/
#include<iostream>
#include<stdio.h>
using namespace std;
void merge1(int a[],int left,int medi,int right){
int *b=new int[right-left+1];
int i=left;
int j=medi+1;
int t=0;
while(i<=medi&&j<=right){
if(a[i]<a[j]){
b[t++]=a[i++];
}
else{
b[t++]=a[j++];
}
}
while(j<right+1){
b[t++]=a[j++];
}
while(i<=medi){
b[t++]=a[i++];
}
for(int t=0,i=left;i<=right;i++){
a[i]=b[t++];
}
delete[] b;
}
void mergesort(int a[],int i,int j){
if(i>=j)
return ; //递归出口
int medi=(i+j)/2;
mergesort(a,i,medi); //对左边的进行归并排序
mergesort(a,medi+1,j); //对右边的进行归并排序
merge1(a,i,medi,j); //归并
}
int main(){
int a[8]={3,98,43,9,36,45,2,7};
mergesort(a, 0,7);
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}