美文网首页程序员
快速排序——JS篇

快速排序——JS篇

作者: shengbeiniao | 来源:发表于2017-12-04 15:31 被阅读0次

快速排序使用分治法(Divide and conquer)策略来把一个序列分为两个子序列。

步骤为:

  1. 从数列中挑出一个元素,称为"基准"(pivot),
  2. 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

参考维基百科

let quickSort=function(list) {
  if(list.length<=1){
    return list;
  }else{
    let middle=list[0];
    let leftList=[];
    let rightList=[];
    //存放重复元素
    let middleList=[];
    list.forEach(node=>{
      if(node<middle){
        leftList.push(node);
      }else if(node>middle){
        rightList.push(node);
      }else{
        middleList.push(node);
      }
    });
    //递归调用,注意concat方法每次会返回新的子串,需要开辟额外的内存空间
    return [].concat(quickSort(leftList),middleList,quickSort(rightList));
  }
};

let randomList=function (size) {
  let list=[];
  for(let i=0;i<size;i++){
    list.push(Math.floor(Math.random()*100));
  }
  return list;
};

let sortList=quickSort(randomList(10));
console.log(sortList);

上述实现平均时间复杂度为O(nlog n),最坏的情况是排列一个已经有序的数组,时间复杂度会降级为n*n

快速排序是Array.prototype.sort()的默认实现,实际编码中直接调用即可。

相关文章

  • 快速排序——JS篇

    快速排序使用分治法(Divide and conquer)策略来把一个序列分为两个子序列。 步骤为: 从数列中挑出...

  • js排序 - 快速排序

    (1)在数据集之中,选择一个元素作为"基准"(pivot)。 (2)所有小于"基准"的元素,都移到"基准"的左边;...

  • js 快速排序

    quickSort(arr){if(arr.length<=1){return arr}var povitInde...

  • JS———快速排序

    function sorts(arr){ if(arr.length<=1){ return arr } var...

  • JS快速排序

    前言 这两天看到阮一峰前辈的快排引起的一系列事件...(居然DDOS都出来了),前端界又被顺路diss了一番,想起...

  • JS快速排序

  • JS快速排序

    从数组中选取一个数据作为基准,一般默认数组中第一个数据,然后比基准小的放到左侧,比基准大的放到右侧完成第一轮后分割...

  • js快速排序

    首先了解什么是快速排序。 1、找到一个基准值(一般是中间位)2、然后将数组的值与基准值比较,分为两个数组(比基准值...

  • 快速排序(JS)

    快速排序是处理大数据集最快的排序算法之一。它是一种分而治之的算法,通过递归的方式将数据依次分解为包含较小元素和较大...

  • JS快速排序

网友评论

    本文标题:快速排序——JS篇

    本文链接:https://www.haomeiwen.com/subject/vnhxixtx.html