6. 数组排序【LC912】

125 阅读1分钟

**题目: ** 给你一个整数数组 nums,请你将该数组升序排列。

看下快排

function quickSort(arr) { 
    let len = arr.length;
    if( len < 2 ) {
        return arr;
    }
    const left = [];
    const right = [];
    let curIdx = Math.floor(len / 2);
    let curVal = arr[curIdx];
    for(let i = 0; i < len; i++) {
        if(arr[i] < curVal) {
            left.push(arr[i])
        } else {
            right.push(arr[i])
        }
    }
    return quickSort(left).concat(curVal, quickSort(right));
}

上述是快排空间换时间的思路.

接下来看下partition的思路:

function partition(arr, l, r) {
    let pivot = arr[r]
    let less = l - 1; // less区域指针
    let more = r; // more区域指针
    // l相当于等于区域右侧指针,即当前位指针
    while(l < more) {
        if(arr[l] < pivot) {
            swap(arr, ++less, l++) //  小的数值要换到小数值区域指针后一位,也就是小数值区域扩展,l指针右移,处理下一项。
        } else if(arr[l] > pivot) {
            swap(arr, l, --more) // l指针停留,more指针前移
        } else {
            l++;
        }
    }
    swap(arr, l, r) // l指针指向more指针指向相同
    return [less+1, more] // 等于 pivot的数组索引
}


function quickSort(arr, left, right) {
    if(left < right) {
        let pivot = partition(arr, left, right);
        quickSort(arr, left, pivot[0] - 1);
        quickSort(arr, pivot[1] + 1, right);
    }
}

———— 前端、Javascript实现、算法、刷题、leetcode