归并排序算法(c++)
图文解析
归并排序就是分儿治之的思想将一串数字非为左右两部分,左边的部分再做一次同样的处理直到只剩下一个元素后再停止开始归并。
合并的具体方法我们那最后一次合并来看
循环反复,然后判断结束后第一组是否有数字剩余,如果有就按顺序加入tmp数组,同理如果结束后第二组有数字剩余则将第二组的数字顺序加入数组tmp
代码
#include<iostream>
using namespace std;
int a[100];
int num=1;
void print(int a[],int n)
{
cout<<"第"<<num<<"次递归输出的结果为: ";
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
num++;
cout<<endl;
}
void gether(int a[],int l,int r,int mid,int n)//归并
{
int tmp[100];
int lindex,rindex;
int i,k;
lindex=l;
rindex=mid+1;
for(k=l;k<=r;k++){
tmp[k-l]=a[k];
}
for(k=l;k<=r;k++){
if(lindex>mid){//说明第二分队还有数字未进入数组 将其顺序存入
a[k]=tmp[rindex-l];
rindex++;
}else if(rindex>r){//说明第一分队还有数字未进入数组 将其顺序存入
a[k]=tmp[lindex-l];
lindex++;
}else if(tmp[lindex-l]<tmp[rindex-l]){//如果第一分组的数小于第二分组的数将第一分组数入数组并将其索引加1
a[k]=tmp[lindex-l];
lindex++;
}else{
a[k]=tmp[rindex-l];
rindex++;
}
}
print(a,n);//得出递归每一步的结果
}
void mergesort(int a[],int l,int r,int n)//分治
{
if(l>=r){
return;
}
int mid = (l+r)/2;
mergesort(a,l,mid,n);
mergesort(a,mid+1,r,n);
gether(a,l,r,mid,n);
}
int main()
{
int n;
int left,right;
cout<<"输入要排序的数字个数"<<":";
cin>>n;
cout<<endl;
cout<<"输入要排序的数字"<<":";
for(int i=0;i<n;i++){
cin>>a[i];
}
left=0;
right=n-1;
cout<<"归并排序的结果"<<endl;
mergesort(a,left,right,n);
}