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);
相关文章推荐
- js中递归写法的逐步优化
- 【js】使用缓存优化递归求斐波拉契数列存在的问题
- js递归的优化(尾递归)
- JS的递归与TCO尾调用优化
- JS的递归与TCO尾调用优化
- Js中通过记忆来优化递归方法
- JavaScript学习笔记(十七)js 优化
- JavaScript 的性能优化:加载和执行(以及动态引入的外部 JS 文件在各浏览器中的加载顺序不一致)
- js优化之细节(for 循环)
- 使用 Node.js\/D8 分析 javascript 如何被 V8 引擎优化的
- 分享自己写的纯JS(jQuery)分页控件,也希望高手给予优化
- 递归的优化
- CSS和JS合并优化工具-minify
- js获取html页面节点方法(递归方式)
- js获取html页面节点方法(递归方式)
- 实现js尾递归优化的代码
- .net对js和css、img剥离项目进行压缩优化、cdn加速
- js基础例子购物车升级版(未优化版)
- python之递归栈溢出优化方式
- js冒泡排序优化排序次数