您的位置:首页 > Web前端 > JavaScript

js快排尾递归优化

2019-03-25 21:13 85 查看

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

常规版本

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: