AcWing

快排和归并排序模板

nkul · 1月25日 · 2021年 · · 91次已读

快速排序

#include 

using namespace std;

const int N = 1000010;

int q[N];

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

    //边界处理,下面while循环第一步就是do i++,因此将指针定在边界两侧,基点选中间值。
    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]);
    }

    //此处为j!!!
    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}

int main()
{
    int n;
    scanf("%d", &n);

    for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);

    quick_sort(q, 0, n - 1);

    for (int i = 0; i < n; i ++ ) printf("%d ", q[i]);

    return 0;
}

归并排序

#include 

using namespace std;

const int N = 1000010;

int n ;

int q[N],tmp[N];

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);


    //以下是归并过程,借助额外数组tmp,i指向第一个有序数组,j指向第二个有序数组,k为临时数组指针
    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(i = l ,j = 0;i <= r; i++,j++) q[i] = tmp[j];
}

int main(){

    scanf("%d", &n);

    for(int i = 0;i < n; i++) scanf("%d",&q[i]);
    
    merge_sort(q, 0 ,n - 1);
    
    for(int i = 0;i < n; i++) printf("%d ",q[i]);

    return 0;
    
}

1、时间复杂度为: $$O(nlogn)$$

2、快排不稳定,归并排序稳定;若将数据指定为pair,不稳定排序也会变得稳定



0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!