javascript 递归之 快速排序
1. 快速排序思想
(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
2. 数字数组排序步骤分析
(1) 原始数组 [23,4,16,49,34,86,801]
(2) 确定中间位置,将原数组一分为二后 [23,4,16,34] 49 [86,801]
(3) 对左半部分和右半部分数组分别进行上述操作 4 [23,16,34] 49 86 [801]
(4) 重复第三部分 4 16 [23,34] 49 86 801
(5) 4 16 23 [34] 49 86 801
(6) 4 16 23 34 49 86 801
3.基于递归思想的javascript实现
function quickSort(arr){
if(arr.length <= 1){ //长度小于1直接返回
return arr;
}
var pivotIndex = Math.floor(arr.length/2); //向上取整,取中间位置
var pivot = arr[pivotIndex ]; //取中间值
var less = Array(), greater = Array();
for (var i = 0; i < arr.length; i++){
if(i !=pivotIndex ){
if (arr[i] >= pivot ) {
greater .push(arr[i]); //右半部分
}else {
less .push(arr[i]); //左半部分
}
}
}
return quickSort(less).concat([pivot],quickSort(greater)); //递归调用
}
操作javascript数组也可去除中间元素后直接去掉中间元素,遍历的时候可少进行一次判断
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
for (var i = 0; i < arr.length; i++){
if (arr[i] >= pivot ) {
greater .push(arr[i]); //右半部分
}else {
less .push(arr[i]); //左半部分
}
}
javascript 递归之 快速排序的更多相关文章
- JavaScript 排序算法——快速排序
常见排序 javaScript 实现的常见排序算法有:冒泡排序.选择排序.插入排序.谢尔排序.快速排序(递归).快速排序(堆栈).归并排序.堆排序. 过程 "快速排序"的思想很简单 ...
- JavaScript递归原理
JavaScript递归是除了闭包以外,函数的又一特色呢.很多开发新手都很难理解递归的原理,我在此总结出自己对递归的理解. 所谓递归,可以这样理解,就是一个函数在自身的局部环境里通过自身函数名又调用, ...
- javascript递归、循环、迭代、遍历和枚举概念
javascript递归.循环.迭代.遍历和枚举概念 〓递归(recursion)在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.递归一词还较常用于描述以自相似方法重复事物的过程.例如,当 ...
- JavaScript排序算法——快速排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- javascript 递归之阶乘
阶乘,即5! = 5*4*3*2*1, 先看传统的做法,利用while循环实现: function factorial(num){ var result = num; if(num<0){ re ...
- JavaScript 递归
递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题.通常涉及 函数调用自身. 能够像下面这样直接调用自身的方法或函数,是递归函数: var recursiveFunction = ...
- JavaScript递归中的作用域问题
需求是这样的,从子节点寻找指定className的父节点,一开始就想到递归(笨!),Dom结构如下: <div class="layer_1"> <div cla ...
- 【JavaScript算法】---快速排序法
一.快速排序法概念 我们将一个杂乱无章的数组进行一个快速排序,可以先从一个数组中取一个中间值,将一个数组一分为2,左边的数组跟中间值进行比较,小的放在左边,大的放在右边.比较完毕后再次取中间值,再次比 ...
- JavaScript 递归法排列组合二维数组2
<html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...
随机推荐
- NOI2005维修数列
剧恶心的splay…… 为什么在bzoj上是超时,在自己的电脑上测的是栈溢出…… ; maxc=; var n,m,i,j,y,root,x,posi,t,head:longint; ch:char; ...
- angularjs的事件 $broadcast and $emit and $on
angularjs的事件 $broadcast and $emit and $on <!DOCTYPE html> <html> <head> <meta c ...
- Java [leetcode 28]Implement strStr()
题目描述: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ...
- OpenGL学习之路(五)
1 引子 不知不觉我们已经进入到读书笔记(五)了,我们先对前四次读书笔记做一个总结.前四次读书笔记主要是学习了如何使用OpenGL来绘制几何图形(包括二维几何体和三维几何体),并学习了平移.旋转.缩放 ...
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.5.2
The elementary tensors $x\otimes \cdots \otimes x$, with all factors equal, are all in the subspace ...
- IComparer接口与
IComparable比较接口,继承此接口可对lis<T>调用sort进行排序 或者调用sort时可以为sort方法提供继承了IComparer的比较器
- 【转载】lua中的require机制
[转载自]http://blog.chinaunix.net/uid-552961-id-2736410.html lua中的require机制 为了方便代码管理,通常会把lua代码分成不同的模块,然 ...
- 最近升级了一下小老婆(8核 2x8G DDR3 128G SSD)
晒图(笔者的硬件知识属于小白级别, 且看且参考吧): 另外优化一下休眠&虚拟内存功能节省SSD空间: 1. 台式机, 休眠功能基本没必要, 果断关掉 C:\Windows\system32&g ...
- String类 and StringBuffer类
1.equals() ==: a)对于原生数据类型来说,比较的是左右两边的值是否相等. b)对于引用类型来说,比较左右两边的引用是否指向同一个对象,或者说左右两边的引用地址是否相同. equals() ...
- DataRow数组 转 datatable
DataTable tmpdt = dt.Clone(); DataRow[] drs = dt.Select("legnbr="+legNbr); ) { tmpdt = drs ...