js快速排序算法与应用

273 阅读1分钟

快速排序的基本思路

function MySort( arr ) {
    // 交换函数
    const swap = (x, y) => {
        let temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }
    // 分割数组,找到基准点
    const partition = (left, right) => {
        let len = right - left + 1;
        if(len <= 1) return;
        let first = arr[left];
        while(left < right){
            while(left < right && arr[right] >= first) --right;
            swap(left, right);
            while(left < right && arr[left] <= first) ++left;
            swap(left, right);
        }
        return left
    }
 
    const quickSort = (left, right) => {
        if(right - left <= 0) return;
        const point = partition(left, right);
        // 递归调用,对左子树组进行快速排序
        quickSort(left, point-1);
        // 递归调用,对右子树组进行快速排序
        quickSort(point+1, right);
    }
    quickSort(0, arr.length-1);
    return arr;
}

应用: 使用快速排序的思路找到数组中第K大的数 思路: 上面是从小到大排序,这里求第K大的数就改成从大到小排序,即将partition函数中的arr[right] >= firstarr[left] <= first符号进行对调。然后先找基准点,找到基准点point后,判断一下基准点的位置,

  1. 如果位置刚好是K-1的话,说明这个数就是第K大的数,因为基准点左边的数都比它大,数组从0开始,直接返回该数值
  2. 如果位置小于K-1的话,说明要找的数在基准点的右边,那么只需要再对右边的数组进行快排
  3. 如果位置大于K-1的话,说明要找的数在基准点的左边,那么只需要对数组中基准点左边的数据进行快排 特殊情况是数组中只有一个元素的话,那么不需要排序了,直接返回这个数
function quickSort(left, right){
    if(right - left <= 0) return a[left];
    let partitionIndex = partition(left, right);
    if(partitionIndex === K - 1) return a[partitionIndex];
    if(partitionIndex < K-1) return quickSort(partitionIndex+1, right);
    return quickSort(left, partitionIndex - 1);
}