想必大家都应该知道归并排序的思路了
那么我就不多做解释,直接看代码(细节处都是标明了的)
建议先看主函数,再看mergesort函数,最后看merge函数
//从小到大的归并排序
#include<iostream>
using namespace std;
void merge(int a[],int start1,int end1,int start2,int end2){
//准备工作
int n1=end1-start1+1;
int n2=end2-start2+1;
int a_left[n1],a_right[n2];
//把a数组的数字分别转移到a_left和a_right
for(int i=0;i<n1;i++) a_left[i]=a[start1+i]; //注意下标是从0开始(为了方便转移)
for(int i=0;i<n2;i++) a_right[i]=a[start2+i];
int p=start1; //全局指针
int left=0,right=0;//左右部分的指针
//开始合并(有3种情况)
//1.当左右都有数字时
while(left<n1 && right<n2)
//注意这里不能取等,因为下标是从0开始,所以n1,n2的在数值上会比left和right大1
//例如:n1是5,但left下标最多只能到4(分别指向0.1.2.3.4)
{
if(a_left[left]<=a_right[right]){
a[p]=a_left[left];
left++;
}
else{
a[p]=a_right[right];
right++;
}
p++;
}
//2.当右边无数字时,左边还有
while(left<n1){
a[p]=a_left[left];
left++;
p++;
}
//3.当左边无数字时,右边还有
while(right<n2){
a[p]=a_right[right];
right++;
p++;
}
}
void mergesort(int a[],int start,int end)
{
if(start<end) //拆分的前提是数字数量不能为1
{
int mid=(start+end)/2;
//递归拆分
mergesort(a,start,mid);
mergesort(a,mid+1,end);
//拆完就开始合并
merge(a,start,mid,mid+1,end);
}
}
int main(){
int n;
cin>>n;
int a[100010];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
//归并排序
mergesort(a,1,n);
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
}
by the way:想要从大到小排序只需要修改第23行
将
if(a_left[left]<=a_right[right])
改为
if(a_left[left]>=a_right[right])