快排的两路划分 与 三路划分

快排两路划分(洛谷最后一个例子超时)

void quick_sort(int* a, int l, int r) {
    if(l>=r)    return;
    int ml = l+1, mr = r, key=a[l];
    while(true){
        while(ml<=r&&a[ml]<=key)    ml++;
        while(mr>=l+1&&a[mr]>=key)    mr--;
        if(ml>mr)    break;
        swap(a[ml++], a[mr--]);
    }
    swap(a[l], a[mr]);
    quick_sort(a, l, mr-1);
    quick_sort(a, mr+1, r);
    return ;
}

快排三路划分(速度飞起)

void _qsort2(int a[], int l, int r) { // 三路快排
    // l-(lt-1): 小于a[l]的元素
    // lt-(i-1): d等于a[l]的元素
    // i-gt: 不确定的元素
    // (gt+1)-(r): 大于a[l]的元素
    if (l >= r) return ;
    int lt = l;
    int i = l;
    int gt = r;
    int v = a[l];
    while (i <= gt) {
        if (a[i] == v) i++;
        else if (a[i] < v)  { swap(a[lt], a[i]); i++; lt++;}
        else                 { swap(a[gt], a[i]); gt--;}
    }
    _qsort2(a, l, lt - 1);
    _qsort2(a, gt + 1, r);
    return ;
}
抓住青春的尾巴。。。
原文地址:https://www.cnblogs.com/xidian-mao/p/15048272.html