快速排序算法模板(以中间为基准点)

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j)
    {
        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);//注意这里要以j为基准(或者用i—1,i)防止出现死循环
}

来源:AcWing

两个注意点,起始i和j的赋值要l-1,r+1,第二对子问题处理时用j和j+1或者i-1,i。

归并排序模板

void merge_sort(int q[],int l,int r)
{
    if(l>=r) return;
    int mid =l+r>>1;
    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]) t[k++]=q[i++];
        else t[k++] = q[j++];
    }
    while(i<=mid) t[k++]=q[i++];
    while(j<=r)   t[k++] = q[j++];
    for(int i=l,j=0;i<=r;i++,j++) q[i] = t[j];
}