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);

你可能感兴趣的:(算法)