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]);  //左半部分
    }
 }

  

时间: 2024-08-04 02:18:30

javascript 递归之 快速排序的相关文章

JavaScript递归中的作用域问题

需求是这样的,从子节点寻找指定className的父节点,一开始就想到递归(笨!),Dom结构如下: <div class="layer_1"> <div class="layer_2"> <div class="layer_3"> <div id="layer_4"></div> </div> </div> </div> 先通过i

递归实现快速排序

#include <stdio.h> int a[101], n; void quicksort(int left, int right) { int i,j,t,temp; if (left>right) return; temp = a[left]; i=left; j=right; while(i != j) { while (a[j]>=temp && i<j) j--; while (a[i]<=temp && i<j)

JavaScript递归原理

JavaScript递归是除了闭包以外,函数的又一特色呢.很多开发新手都很难理解递归的原理,我在此总结出自己对递归的理解. 所谓递归,可以这样理解,就是一个函数在自身的局部环境里通过自身函数名又调用,如此反复,直到条件不满足,返回最终结果的一种情形.最简单的一个示例代码如下: function fn(a){ return a <= 1 ? a = 1 : a * fn(a - 1); } 这也是一个最经典的递归阶乘函数了,虽然这行代码表面上看起来没什么问题,但在执行如下代码,则会出现错误. va

JavaScript排序算法——快速排序

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)

冒泡排序算法: 总的来说就是两两交换,反复直到有序,第一个记录和第二个记录,若逆序则交换,然后比较第二个和第三个记录,以此类推,直到第 n 个记录和第 n-1个记录比较完毕为止,第一趟排序,结果关键字最大的记录被安排在最后一个位置.对前 n-1个记录继续冒泡排序,使得关键字次大的记录安排在第 n-1个位置.如此重复,直到没有需要交换的记录为止(仅仅是第一个和第二个交换过为止).整个一趟趟的选出最值的过程,仿佛是那水里的气泡,咕嘟咕嘟的往上翻的过程. 递增冒泡排序过程图解: 一般先比较第一个元素和

javascript 递归之阶乘

阶乘,即5! = 5*4*3*2*1, 先看传统的做法,利用while循环实现: function factorial(num){ var result = num; if(num<0){ return -1; //负数返回-1 } if(num == 0){ return 1; // 0阶乘为1 } while(num-- >2){ result = result*num; } return result; } javascript递归函数通过它调用其本身,利用递归的思路的话,阶乘的思路应该

JavaScript 递归

递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题.通常涉及 函数调用自身. 能够像下面这样直接调用自身的方法或函数,是递归函数: var recursiveFunction = function(someParam){ recursiveFunction(someParam); }; 能够像下面这样间接调用自身的函数,也是递归函数: var recursiveFunction1 = function(someParam){ recursiveFunction2(somePa

javascript --- 递归的简单理解

递归函数大家都应该比较熟吧?那么,如何在JavaScript中书写一个完美的递归函数呢?且听我娓娓道来. 递归函数 写的时候,查了一下维基百科对递归函数的定义,恕我愚钝,简直太深奥了!所以,我还是简单的说说我对递归函数的理解吧.递归函数,说白了就是在函数内部引用函数自身,最终到给定的递归结束条件时回溯.当然,你也可以不给定结束条件,死了别挂我~(╯﹏╰)~. 简单说就是有两个条件: 1. 在函数内部引用自身. 2. 每个递归函数里必定有一个终止条件. 来个小李子: function test(n

JavaScript——递归,嵌套和闭包

关于函数创建的三种方式以及递归,嵌套和闭包的概念经常容易搞混. 函数定义的三种方式:1.声明式函数(标准的关键字function+函数名+(参数列表)+{函数主体}) 例如:function functionname(param1,param2,......,paramn) {function statment} 2.匿名式函数(将函数赋予的变量+构造函数Function+(参数)) 例如:var variable=new Function("param1","param2&