快速排序

概念:

(1) 首先,从数组中选择中间一项作为主元。

(2) 创建两个指针,左边一个指向数组第一个项,右边一个指向数组最后一个项。移动左指针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素,然后交

换它们,重复这个过程,直到左指针超过了右指针。这个过程将使得比主元小的值都排在主元之前,而比主元大的值都排在主元之后。这一步叫作划分操作。

(3) 接着,算法对划分后的小数组(较主元小的值组成的子数组,以及较主元大的值组成的子数组)重复之前的两个步骤,直至数组已完全排序。

复杂度为:O(nlogn)

代码实现:

var quickSort = function(array) {
quick(array, 0, array.length - 1);
}; var swap = function(array, index1, index2){
var aux = array[index1];
array[index1] = array[index2];
array[index2] = aux;
}; var quick = function(array, left, right){
var index; //{1}
if (array.length > 1) { //{2}
index = partition(array, left, right); //{3}partition函数返回值将赋值给index
if (left < index - 1) { //{4}如果子数组存在较小值的元素
quick(array, left, index - 1); //{5}则对该数组重复这个过程
}
if (index < right) { //{6}
quick(array, index, right); //{7}如果存在子数组存在较大值,我们也将重复快速排序过程
}
}
}; var partition = function(array, left, right) {
var pivot = array[Math.floor((right + left) / 2)], //{8}我们选择中间项作为主元
i = left, //{9},初始化为数组第一个元素
j = right; //{10}初始化为数组最后一个元素。
while (i <= j) { //{11}只要left和right指针没有相互交错
while (array[i] < pivot) { //{12}首先,移动left指针直到找到一个元素比主元大
i++;
}
while (array[j] > pivot) { //{13}对right指针,我们做同样的事情,移动right指针直到我们找到一个元素比主元小。
j--;
}
if (i <= j) { //{14}当左指针指向的元素比主元大且右指针指向的元素比主元小,并且此时左指针索引没有右指针索引大
swap(array, i, j); //{15}我们交换它们,然后移动两个指针,并重复此过程
i++;
j--;
}
}
return i; //{16}
}; var array = [3,5,1,6,4,7,2];
quickSort(array);
console.log(array);// [1, 2, 3, 4, 5, 6, 7]

 可以点击下面链接进行查看:

See the Pen 快速排序 by rachel (@pprachel) on CodePen.

实现过程:

下面的示意图展示了对有较小值的子数组执行的划分操作(注意7 和6 不包含在子数组之内):

接着,我们继续创建子数组,请看下图,但是这次操作是针对上图中有较大值的子数组(有1 的那个较小子数组不用再划分了,因为它仅含有一个项)。

子数组([2, 3, 5, 4] )中的较小子数组([2, 3] )继续进行划分(算法代码中的行{5} ):

然后子数组([2, 3, 5, 4] )中的较大子数组([5, 4] )也继续进行划分(算法中的行{7} ),示意图如下:

最终,较大子数组[6, 7] 也会进行划分(partition )操作,快速排序算法的操作执行完成。

可以通过下面这个网站看动态的过程:https://visualgo.net/zh/sorting

优化:

1.即挑选基准元素时,先把第一个元素、最后一个元素和中间一个元素挑出来,这三个元素中大小在中间的那个元素就被认为是基准元素。https://www.jianshu.com/p/fc342a9ffb58

2.三路快排:https://www.jianshu.com/p/fc342a9ffb58


javascript排序算法-快速排序的更多相关文章

  1. JavaScript 排序算法——快速排序

    常见排序 javaScript 实现的常见排序算法有:冒泡排序.选择排序.插入排序.谢尔排序.快速排序(递归).快速排序(堆栈).归并排序.堆排序. 过程 "快速排序"的思想很简单 ...

  2. JavaScript排序算法——快速排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 《Java算法》排序算法-快速排序

    排序算法-快速排序: /** * 给定一个数组:按照从小到大排序. * 思路: * 1. 获取第一个数放入临时变量data,将大于data的数放右边,小于data的数放在左边. * 2. data左边 ...

  4. 数据结构和算法(Golang实现)(25)排序算法-快速排序

    快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...

  5. 使用 js 实现十大排序算法: 快速排序

    使用 js 实现十大排序算法: 快速排序 QuickSort 快速排序 /** * * @author xgqfrms * @license MIT * @copyright xgqfrms * @c ...

  6. JavaScript 排序算法(JavaScript sorting algorithms)

    JavaScrip 排序算法(JavaScript Sorting Algorithms) 基础构造函数 以下几种排序算法做为方法放在构造函数里. function ArrayList () { va ...

  7. JavaScript 排序算法

    排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的 ...

  8. Python排序算法——快速排序

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10768593.html 排序算法(Sortin ...

  9. js 实现排序算法 -- 快速排序(Quick Sort)

    原文: 十大经典排序算法(动图演示) 快速排序 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整 ...

随机推荐

  1. 【HADOOP】| 环境搭建:从零开始搭建hadoop大数据平台(单机/伪分布式)-下

    因篇幅过长,故分为两节,上节主要说明hadoop运行环境和必须的基础软件,包括VMware虚拟机软件的说明安装.Xmanager5管理软件以及CentOS操作系统的安装和基本网络配置.具体请参看: [ ...

  2. Python-炫酷二维码

    一.环境 首先是安装python环境,如果没有安装python环境看此处 二.myqr     myqr 其实是一个 python 的脚本,可以生产二维码图片,作者也对python脚本进行了打包,在 ...

  3. Hibernate内容详解

    一:引入Hibernate的jar包 http://t.cn/EioD1xk 二:配置Hibernate的核心配置文件hibernate.cfg.xml <!DOCTYPE hibernate- ...

  4. SpringCloud分布式微服务搭建(二)

    这个例子主要是将zuul和eureka结合起来使用,zuul作为反向代理,同时起到负载均衡的作用,同时网关后面的消费者也作为服务提供者,同时提供负载均衡. 一.API网关(摘自百度) API网关是一个 ...

  5. Quartz.Net学习笔记

    一.概述 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net应用中.它灵 ...

  6. Web前后端分离

    第一篇博客:见谅 用自己的通俗语言讲web工程的前后端分离: 只是从自己的角度去分析,我眼中的前后端分离(可能不对) 首先要明白我们服务器和浏览器之前传输和接受的是什么: 静态文件(html,css, ...

  7. headfirst设计模式(8)—适配器模式与外观模式

    前言 这一章主要讲2个模式,一个是,适配器模式(负责将一个类的接口适配成用户所期待的),另外一个是外观模式(为子系统提供一个共同的对外接口),看完的第一反应是,为什么要把它们两放在同一章,难道它们有什 ...

  8. 如何通过免费开源的ERP Odoo打造企业全员营销整体解决方案

    应用场景的背景故事 在一些二级城市,往往线索的来源是通过企业当地口碑积累.熟人转介绍等线下的方式为主,利用互联网的模式往往很难奏效,企业面临的第一个问题就是如何把握线索真实的来源介绍的问题.在这个问题 ...

  9. 5G 时代,可能是什么样呢?

        (摄于上海陆家嘴) 众所周知,5g时代即将到来,其相关的区块链技术也将在更多的领域以及方面发挥越来越多的作用. 与新模式与新领域这种软性变化不同,新技术的产生,有着足够的想象空间.仅从内容创作 ...

  10. ASP.NET Core 身份验证(一)

    前言 这篇文章我想带领大家了解一下 ASP.NET Core 中如何进行的身份验证,在开始之前强烈建议还没看过我写的 Identity 系列文章的同学先看一下. Identity 入门系列文章: Id ...