快排
void quick_sort(int q[],int l,int r)
{
if(l>=r) return ;
int x=q[l],i=l-1,j=r+1; //确定分界点x
while(i<j){ //分堆:<=x ; >=x
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j) swap(q[i],q[j]);
}
quick_sort(q,l,j); //递归处理左右两堆
quick_sort(q,j+1,r);
}
归排
void merge_sort(int q[],int l,int r)
{
if(l>=r) return ;
int mid=l+r>>1; //确定分界点mid
int t[N];
merge_sort(q,l,mid); //递归排序左右两堆
merge_sort(q,mid+1,r);
int i=l,j=mid+1,k=0; //归并:合二为一
while(i<=mid&&j<=r)
if(q[i]<=q[j]) t[k++]=q[i++];
else t[k++]=q[j++];
while(i<=mid) t[k++]=q[i++];
while(j<=r) t[k++]=q[j++];
for(i=l,j=0;i<=r;i++,j++) q[i]=t[j];
}