美文网首页让前端飞Web前端之路前端开发
快速排序基本原理以及JS实现

快速排序基本原理以及JS实现

作者: Harlan_Zhang | 来源:发表于2019-06-13 13:52 被阅读2次

前言

高手选择排序的方式是根据具体的数据而选择不同的排序,我们这些小菜鸟该怎么办?当然是快速排序一把梭(程序员不要提冒泡了),快排基本上能满足你遇到的90%的排序需求,对于我们前端而言可能是99%。

算法原理

快速排序的基本思想是“分治”,“分治”的基本思想是把一个规模为N的问题分解成K个规模较小的子问题,这些子问题的相互独立并且与原问题性质相同,所以可以不断的递归求解。

快速排序的方法如下:

  • 在给出的一组数据中选出一个基准值。
  • 将这组数据中所有比基准值大的数放在右边,所有比基准值小的数放在左边,分界线就是该基准值。
  • 对基准值左右两边的两组数使用同样的方式排序,不断递归,直到所有数据排序完成。

具体实现

举例:
[5, 2, 6, 9, 7, 3, 12]

  1. 选出基准数,基准数的选择一般常用的有两种方式。第一种是选择该组数据的第一个数,第二种是生成一个数据总数量以内的随机数,作为基准数的数组索引,以此来选出基准数。因为从理论上我们不知道要排序的具体数据,因此使用第一种方式选择的基准数本身就是随机的,一般情况下我们使用第一种方式选出基准数,比如此例中我们选择5来作为基准数。
  2. 要实现基准数左边数据都比其小,右边数据都比起大,这一步依然有两种方式。第一种是从数组左右两边分别开始搜索,从右边开始向左查找,找到第一个比基准数小的数3,然后再从左向右开始查找,找到第一个比基准数大的数6,然后交换它们的位置,最后的数据为
    [5, 2, 3, 9, 7, 6, 12]
    依次执行上面的步骤,设从左边查找的索引为left,从右边查找的索引为right,当最后left = right时,将给位置的数和基准数交换位置,最后结果为
    [3, 2, 5, 9, 7, 6, 12]
    第二种方法也被称做“填坑”法,从有向做开始查找第一个小于基准数的数3,然后将其填到left指向的位置[3, 2, 6, 9, 7, 3, 12],然后开始从左向右查找第一个大于基准数的数6,将其填到right指向的位置[3, 2, 6, 9, 7, 6, 12],然后重复以上过程,最后将left = right时指向的位置填入基准数5 ->[3, 2, 5, 9, 7, 6, 12]
  3. 然后对基准数左右部分的两个数组[3, 2]和[9, 7, 6, 12]依次采用这种方法递归排序,最终得到排序完成的数组[2, 3, 5, 6, 7, 9, 12]

JavaScript代码实现:

/*第二步使用的是填坑法*/

/*
* data - 排序数组
* low - 数组最左端索引
* height - 数组最右端索引
*/

function quickSort(data, low, height) {
  let sortData = data
  let isLeft = true
  let left = low,
    right = height,
    temp = sortData[left]
  if (low >= height) {
    return sortData
  }
  while (left !== right) {
    if (isLeft) {
      if (sortData[right] < temp) {
        sortData[left] = sortData[right]
        isLeft = !isLeft
      } else {
        right--
      }
    } else {
      if (sortData[left] > temp) {
        sortData[right] = sortData[left]
        isLeft = !isLeft
      } else {
        left++
      }
    }
  }
  sortData[left] = temp
  quickSort(sortData, low, left - 1)
  quickSort(sortData, left + 1, height)
  return sortData
}

相关文章

  • 快速排序基本原理以及JS实现

    前言 高手选择排序的方式是根据具体的数据而选择不同的排序,我们这些小菜鸟该怎么办?当然是快速排序一把梭(程序员不要...

  • JS实现快速排序

    大致分三步: 1、找基准(一般是以中间项为基准) 2、遍历数组,小于基准的放在left,大于基准的放在right ...

  • JS实现快速排序

    看了一篇通俗易懂的快排文章 快排,下面一步一步 实现整个过程。 快排的基本思想 上面链接的文章对快排的思路提出了一...

  • 快速排序JS实现

    快速排序原理 快速排序的基本思想是选取一个基准值将排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分...

  • JS实现快速排序

    快速排序用到以下方法 Math.floor->返回小于或等于一个给定数字的最大整数 splice->向/从数组中添...

  • JS实现快速排序

  • JS 实现快速排序

    快速排序的思想 (1)在数据集之中,找一个基准点 (2)建立两个数组,分别存储左边和右边的数组 (3)利用递归进行...

  • python 排序算法

    文章概述 介绍各大常用经典的排序算法和效率,以及python实现常用算法(冒泡排序,选择排序,快速排序,插入排序)...

  • 排序算法——冒泡排序

    冒泡排序(Bubble sort) 目录 1. 基本原理 图解 2. 代码实现 java 一、基本原理 冒泡排序(...

  • js实现选择排序以及冒泡排序

    463 给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法。 选择排序(S...

网友评论

    本文标题:快速排序基本原理以及JS实现

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