快速排序
//快速排序算法模板
void quick_sort (int q[],int l,int r)
{
if(l>=r)return;
int i=l-1,j=r+1,x=q[l]; //x=q[r]
while(i<j)
{
do i++; while(q[i]<x);
do j--; while(q[j]>x);
if(i<j)swap(q[i],q[j]);
else break;
}
quick_sort(q,l,j),quick_sort(q,j+1,r);
//quick_sort(q,l,i-1),quick_sort(q,i,r);
}
注意边界问题!!!
当x取q[l]时,递归不能用左指针i
当x取q[r]时,递归不能用右指针j
归并排序
//归并排序模板
void merge_sort (int q[],int l,int r)
{
if(l>=r)return;
int mid=(l+r)/2;
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
if(q[i]<q[j])tmp[k++]=q[i++];
else tmp[k++]=q[j++];
while(i<=mid)tmp[k++]=q[i++];
while(j<=r)tmp[k++]=q[j++];
for(int i=l,j=0;i<=r;i++,j++)q[i]=tmp[j];
}