归并
void merge_sort(int a[],int l,int r)
{
if(l>=r) return; //判断一下当前区间内是否只有一个数或者没有数
//确定分界点
int mid=l+r>>1; //取整个区间中点
//递归排序左右两边
merge_sort(a,l,mid); //递归排序左边
merge_sort(a,mid+1,r); //递归排序右边
//归并——合二为一
int k=0,i=l,j=mid+1; //i指向左半边有序序列起点,j指向右半边
while(i<=mid&&j<=r){ //当左右都未循环空
if(a[i]<a[j]) tmp[k++]=a[i++]; //每次把较小的放进tmp
else tmp[k++]=a[j++];
}
while(i<=mid) tmp[k++]=a[i++]; //如果说左右两边有一边没有循环完
while(j<=r) tmp[k++]=a[j++]; //剩余的数直接全部连进tmp里
for(i=l,j=0;i<=r;i++,j++) a[i]=tmp[j]; //tmp存回a
}
快排
void quick_sort(int a[],int l,int r)
{
if(l>=r) return ; //边界 如果区间里无数或者剩一个数
//确定分界点
int x=a[l+r>>1],i=l-1,j=r+1; //确定分界点 两个指针处于边界两侧
//调整区间
while(i<j){ //直到两指针相遇
do i++;while(a[i]<x); //先移动 比x小 左指针继续右移
do j--;while(a[j]>x); //先移动 比x大 右指针继续左移
if(i<j) swap(a[i],a[j]);//如果两指针未相遇 swap值
}
//递归处理左右两边
quick_sort(a,l,j); //递归排左半边
quick_sort(a,j+1,r); //递归排右半边
}