再寫一次快排

LJ2016發表於2019-08-29

快速排序基於分治法的思想,每次劃分後讓樞軸左邊的全部小於等於它,右邊的大於等於它

function devide(a, l, r)
{
    if(l == r) return a[l];
    let pivot = a[l];
    let i = l;
    let j = r;

    while(i < j){
        while(i < j && a[j] >= pivot) j--;
        if(i < j){
            a[i] = a[j];
            i++;
        }

        while(i < j && a[i] <= pivot) i++;
        if(i < j){
            a[j] = a[i];
            j--;
        }
    }

    a[i] = pivot;

    if(i > l) devide(a, l, i-1);
    if(i < r) devide(a, i+1, r);
    return a;
}

function qsort(a)
{
    return devide(a, 0, a.length-1);
}

console.log(qsort([1, -1, 3, 7, 0, 10]));
console.log(qsort([1, -1, 3, 7, 1, 10]));

思考:
快速排序之所以是不穩定的排序,就在於交換的過程中相等元素後面可能被換到前面去

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章