js快排尾递归优化

尾递归是个什么东西这边就不介绍了。总之递归我是一直没有搞明白。但是我知道尾递归是为了解决递归造成的栈溢出和大量重复的计算。

常规版本

function quickSort(arr, left, right) {
    // 递归跳出条件
    if (left >= right)
        return;
    let i = left,
        j = right,
        flag = arr[left]; // 定义的基准
    while (i < j) {
        // 找到比flag小的
        while (i < j && arr[j] >= flag)
            j--;
        // 找到比flag大的
        while (i < j && arr[i] <= flag)
            i++;
        // 交换i和j
        if (i <= j) {
            let temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    // 交换基准和i
    arr[left] = arr[i];
    arr[i] = flag;
    // 对左边快排
    quickSort(arr, left, i - 1);
    // 对右边快排
    quickSort(arr, i + 1, right);
}
let testArr = [2, 4, 1, 5, 8, 6, 7, 9, 0];
quickSort(testArr, 0, testArr.length - 1);
console.log(testArr);

尾递归版本

function tailQuickSort(arr, left, right) {
    let i = left,
        j = right,
        flag = arr[left];
    while (i < j) {
        while (i < j && arr[j] >= flag)
            j--;
        while (i < j && arr[i] <= flag)
            i++;
        if (i < j) {
            let temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    arr[left] = arr[i];
    arr[i] = flag;
    return i;
}

function quickSort(arr, left, right) {
    let pivot = left;
    while (left < right) {
        pivot = tailQuickSort(arr, left, right);
        quickSort(arr, left, pivot - 1);
        left = pivot + 1;
    }
}

let testArray = [2, 1, 4, 5, 6, 3, 4, 5, 8, 5, 2, 9, 4];
quickSort(testArray, 0, testArray.length - 1);
console.log(testArray);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值