最近正在看递归和分治法,归并排序是一种很经典的实例,妙处就在把整个数组不断二分割,直到分割出元素为止,然后在Merge对两个元素进行排序,可以将我写的实例给换掉,只调用merge函数,不调用merge_sort,如
int a[]={9,1};
//merge(a,p,q,r)
merge(a,0,0,1);
//然后打印出a,你就会发现归并排序的解是如何开始合并的
#include<iostream>
using namespace std;
//合并序列
void merge(int *arr,int p,int q,int r){
//创建两个临时数组a1,a2分别存放左序列arr[p,r],右序列arr[r+1,q]
int n1=q-p+1;
int n2=r-q;
int a1[n1];
int a2[n2];
for(int i=0;i<n1;i++){
a1[i]=*(arr+p+i);
}
for(int i=0;i<n2;i++){
a2[i]=*(arr+q+1+i);
}
//开始合并两个子序列,设置j和k两个自增量分别对应两个临时数组的下标
int j=0,k=0;
for(int i=p;i<r+1;i++)
{
if(a1[j]<=a2[k])
{
*(arr+i)=a1[j++];
}else{
*(arr+i)=a2[k++];
}
}
}
void merge_sort(int *arr,int p,int r)
{
int q=(r+p)/2;
if(p<r){
merge_sort(arr,p,q);
merge_sort(arr,q+1,r);
merge(arr,p,q,r);
}
}
int main(){
//测试用例
int a[]={9,8,7,6,5,4,3,2,1};
int n=sizeof(a)/sizeof(int);
merge_sort(a,0,n-1);
//测试用法
for(int i=0;i<n;i++){
cout<<a[i];
}
}