归并排序、快速排序模板

快速排序

void q_sort_1(int a[], int l, int r){
    if(l >= r) return;
    int x = a[l], i = l - 1, j = r + 1;// do..while()留出空余
    while(i < j){//穿过
        do i++; while(a[i] < x);//等于也停下
        do j--; while(a[j] > x);
        if(i < j) swap(a[i], a[j]);
    }
    q_sort_1(a, l, j), q_sort_1(a, j + 1, r);
}
void q_sort_2(int a[], int l, int r){
    if(l >= r) return;
    int i = l - 1, j = r + 1, x = a[l + r >> 1];
    while(i < j){
        do i++; while(a[i] < x);
        do j--; while(a[j] > x);
        if (i < j) swap(a[i], a[j]);
    }
    q_sort_2(a, l, j), q_sort_2(a, j + 1, r);
}

详见笔记

归并排序

img

img

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 i = l, j = mid + 1, k = 0;
    while(i <= mid && j <= r){
        if(a[i] <= a[j]) temp[k++] = a[i++];
        else temp[k++] = a[j++];
    }
    while(i <= mid) temp[k++] = a[i++];
    while(j <= r) temp[k++] = a[j++];
    for(int i = l, k = 0; i <= r; i++, k++){
        a[i] = temp[k];
    }
}
应用:求逆序对
posted @ 2021-10-09 09:31  wzx1210  阅读(50)  评论(0)    收藏  举报