最小的 k 個元素--快排變形

LJ2016發表於2019-09-01

利用快速排序分割序列的思路,不斷分割陣列即可

function devide(a, l, r, k)
{
    if(r - l + 1 == k) return a.slice(l,  r + 1);
    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 + 1 === k){
        return a.slice(l, i + 1);
    }else if(i - l + 1 > k){
        return devide(a, l, i - 1, k);
    }else{
        return a.slice(l, i + 1).concat(devide(a, i + 1, r, k - (i - l + 1)));
    }
}

let a = [1, -1, 3, 7, 0, 10];
console.log(devide(a, 0, a.length - 1, 1));
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章