1.归并排序
#include<bits/stdc++.h>
using namespace std;
int n,a[100005];
void merge(int L1,int R1,int L2,int R2){
int temp[100005],i=L1,j=L2,cnt=L1;//定义中间数组和双指针
while(i<=R1&&j<=R2){//两部分数据都没结束
//判断大小 并存储到中间数组
if(a[i]<a[j]){
temp[cnt++]=a[i++];
}else{
temp[cnt++]=a[j++];
}
}
//将[L1,R1]剩余元素加入序列
while(i<=R1) temp[cnt++]=a[i++];
//将[L2,R2]剩余元素加入序列
while(j<=R2) temp[cnt++]=a[j++];
//将合并到中间数组中的序列重新赋值给数组a
for(int i=L1;i<=R2;i++) a[i]=temp[i];
}
void msort(int L,int R){//二分递归排序 函数功能:对L~R区间排序
if(L==R) return;//只有一个数 直接结束
int mid=(L+R)>>1;//(L+R)/2 求出mid进行分组
msort(L,mid);//对前半段进行递归排序
msort(mid+1,R);//对后半段进行递归排序
merge(L,mid,mid+1,R);//合并
}
int main(){
//输入待排序数组和信息
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
//排序
msort(1,n);
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}
2.快速排序
#include<bits/stdc++.h>
using namespace std;
int n,a[100005];
void Sort(int L,int R){//函数功能:对于L~R区间内的数排序
if(L>=R) return;//递归结束条件
int temp=a[R],i=L,j=R;
while(i<j){//i j还没相遇 一直调整数的位置
while(a[i]<=temp&&i<j)/*当前数比基准数小 或等于*/ i++;//继续后移 判断下一个数
a[j]=a[i];//此时说明 a[i]>temp 数比基准数大 放在j下标位置
while(a[j]>=temp&&i<j)/*当前数比基准数大 或等于*/ j--;//继续前移 判断下一个数
a[i]=a[j];//此时说明 a[j]<temp 数比基准数小 放在i下标位置
}
a[i]=temp;//说明i==j 此位放置基准数
Sort(L,i-1);//递归 对基准的左半部分数据继续排序
Sort(i+1,R);//基准的右半部分数据继续排序
}
int main(){
//输入待排序数组和信息
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
//排序
Sort(1,n);
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}