轻松学习JS快速排序(QuickSort)

tips:接下去会在github写博客,简书不再更新和修改文章,欢迎大家逛逛我的新博客点击查看 ,我会尽量用更容易理解的方式写好每一篇博客,大家一起学习交流😄。

需了解的基础知识

1.递归函数:编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。
一个典型阶乘递归函数:

function fact(num){ 
   if (num<=1){ 
   return 1; 
   }else{ 
   return num*fact(num-1); 
} 
} 

该函数的弊端:

var another=factorical;
factorical=null;
console.log(another(2))//会报错说 factorical not a function

解决方法: 用arguments.callee去代替函数名,就可以确保函数不管怎么调用都不会出错。

function factorical(num){
  if(num<=1){
    return 1;
  }
  else{
    return num*arguments.callee(num-1);
  }
}
var another=factorical;
factorical=null;
console.log(another(2))//2

(来自js高程)
2.JavaScript中的splice方法用法详解
3.JavaScript concat()方法
3.Javascript之Math对象详解

步骤

以下内容整理自阮一峰老师快速排序(Quicksort)的Javascript实现

首先,定义一个quickSort函数,它的参数是一个数组。

var quickSort = function(arr) {

然后,检查数组的元素个数,如果小于等于1,就返回。

if (arr.length <= 1) { return arr; }

接着,选择"基准"(pivot),并将其与原数组分离,再定义两个空数组,用来存放一左一右的两个子集。splice返回的是数组,用[0]返回值

var pivotIndex = Math.floor(arr.length / 2);
  var pivot = arr.splice(pivotIndex, 1)[0];
  var left = [];
  var right = [];

然后,开始遍历数组,小于"基准"的元素放入左边的子集,大于基准的元素放入右边的子集。

for (var i = 0; i < arr.length; i++){
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }

最后,使用递归不断重复这个过程,就可以得到排序后的数组。

return quickSort(left).concat([pivot], quickSort(right));
};

使用的时候,直接调用quickSort()就行了。

最终的快排函数

var quickSort = function(arr) {
  if (arr.length <= 1) { return arr; }
  var pivotIndex = Math.floor(arr.length / 2);
  var pivot = arr.splice(pivotIndex, 1)[0];
  var left = [];
  var right = [];
  for (var i = 0; i < arr.length; i++){
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return quickSort(left).concat([pivot], quickSort(right));
};

实例运用

var array = [7,4,1,9,6,3,2,5,8] ;
quickSort(array); //输出1,2,3,4,5,6,7,8,9
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 数组排序在日常编程中用到的其实还是比较多的,比如把一组数据按时间排序,按首字母排序,按大小排序等等,那么就让我们一...
    一木_qintb阅读 13,200评论 1 2
  • 数组排序在日常编程中用到的其实还是比较多的,比如把一组数据按时间排序,按首字母排序,按大小排序等等,那么就让我们一...
    xueNoble阅读 2,213评论 0 9
  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 1,255评论 0 4
  • 我出生在豫东平原的一个农民家庭,家中有四姐妹,我排行老二,姐姐比我大两岁,我与下面的两个妹妹,分别都是间隔一...
    姬亚琳阅读 600评论 0 1
  • 看到一半的时候,就想简单粗暴地判断主角是狮子座,又或者是热血青年大同小异的,不怕虎的初生牛犊。一旦不是饭桌上的焦点...
    余冷水阅读 309评论 0 1

友情链接更多精彩内容