快速排序法精简理解

今天工作的空余时间比较多,说点废话。

话说三国时期,孙权送来了一头巨象给曹操,曹操想知道这象的重量,询问属下,都不能说出称象的办法。曹冲说:“把象放到大船上,在水面所达到的地方做上记号,再让船装载其他东西(当水面也达到记号的时候),称一下这些东西,那么比较下(东西的总质量差不多等于大象的质量)就能知道了。”

将一个问题分割称一些小问题,然后递归解决,再利用这些小问题的解合并成原来的的大问题的解,此乃分而治之法。

我理解的快速排序,就是一种分而治之方法。

1.从数列中选出一个元素作为基数(pivot)(一般取第一个或最后一个)。

2.所有的数据都将围绕这个基数进行,将小于改基数的元素放在它的左边,大于或等于它的数全部放在它的右边

3.对左右两个小数列重复上述步骤,直至各区间只有1个数。

如图:

上代码

        var arr = [11,2,3,5,7,1,4,6,15,5,2,7,9,10,15,9,17,12];
            function fastSort(arr){
                if(arr.length == 0){
                    return [];
                }
                var left = [];                            //左侧部分的数
                var right = [];                            //右侧部分的数
                var pivot = arr[0];                        //基数
                for(var i = 1; i < arr.length;i++){
                    if(arr[i] < pivot){                    //小的放到左边
                        left.push(arr[i]);
                    }else{                                //大的放到右边
                        right.push(arr[i])
                    }
                }
                //递归完了,数组一拼接 ,完事儿,谢谢
                return fastSort(left).concat(pivot,fastSort(right));
            }
            //打印下
            console.log(fastSort(arr));

对于空间复杂度,啥时候最佳啥时候最差,不做过多解释,力求精简,反正我一看文字多的博客就耐不下心,估计你们也一样,SO,不多说话。

原文地址:https://www.cnblogs.com/bpjj/p/11246709.html

时间: 2024-10-12 18:58:04

快速排序法精简理解的相关文章

快速排序法(一)

说明快速排序法(quick sort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的.快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边数列进行排序,而影响快速排序法效率的正是轴心的选择.这边所介绍的第一个快速排序法版本,是在多数的教科书上所提及的版本,因为它最容易理解,也最符合轴心分割与左右进行排序的概念,适合对初学者进行讲解.解法这边所介绍的快速演算如下:将最

javascript的快速排序法

在排序方式中,快速是比较普遍使用的,因为其速度快. 因为其是不断的递归,而且是根据基准点的左右两边开始递归,直到数组只有一个值的时候才返回. 这个基准点是自己定的. 一般取中间,比较好理解. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script> va

C#版 选择法、冒泡法、插入法和快速排序法分析与对比(一)

前言 之前老师就讲过了选择法和冒泡法,之后又提到了插入法和排序法,今天做了一个小DEMO,对比了一下四种方法的效率,当然看了很多大牛也博客,其实算法还设计了时间复杂度和空间复杂度,对于这两个概念,我只能从表面上进行理解,其中涉及到了很多数学的问题,所以就不展开写了. 选择排序 冒泡法 插入法 快速排序法 这部分知识比较新,而且内容比较多,所以打算单独另外总结一遍博客,来详细的总结一下这个方法~ DEMO(比较三个算法所用时间) 先说一下设计的思路,生成要求个数的不重复的随机数,将随机数循环赋给l

php四种基础算法:冒泡,选择,插入和快速排序法

转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的.下面是我按自己的理解,将四个方法分析一遍. 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序. $arr(1,43,5

排序算法之JAVA终极快速排序法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class TermSimpleQuick { public int[] sort(int[] arr,int left,int right){ if ( arr == null

数组的排序,冒泡法,快速排序法

1.冒泡法排序 /* * 冒泡法排序 :在要排序的一组数中,对当前还未排好序的范围内的全部数,自左而右对相邻的两个数 * 相邻的两个数的交换 */ public void bubbleSort(int[] num) { int temp = 0; for(int i=0;i<num.length-1;i++){ for(int j=0;j<num.length-1-i;j++){ if(num[j]>num[j+1]){ temp=num[j]; num[j]=num[j+1]; num

ACM——快速排序法

快速排序 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:653            测试通过:297 描述 给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中快速排序算法进行排序,并输出排序最后结果的相应序列. 输入 共两行,第一行给出排序元素数目n,第二行给出n个元素,1≤n≤100000,每个元素值范围为 [0,100000) 输出 一行,输出排序结果. 样例输入 748 36 68 72 12 48 2

闲来无事,温习一下快速排序法

快速排序法,还是很常用的.不论是面试还是写代码.这里说一下怎么coding出快速排序法.至于什么复杂度之类的,请参考http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F#C. 快速排序法的核心是分治法(Divide and conquer),也就是把一个数组一分为二,二分为四....直到不能分了,也就完成排序了.所以快速排序法也就是怎么分的问题.怎么分?当然是按大小分了.所以快速排序法的升序步骤描述为: 选择一个基准元

实例365(14)---------经典数组排序方法------快速排序法

一:截图 二:快速排序详解 快速排序法(QuickSort)是一种非常快的对比排序方法.它也Divide-And-Conquer思想的实现之一.自从其产生以来,快速排序理论得到了极大的改进,然而在实际中却十分难以编程出正确健壮的代码.本文将对快速排序算法的基本理论和编程实践方面做作一个全面的讲解.在本文讲解中,将忽略很多细枝末节,试图给读者形成一个非常具体的快速排序形象. 快速排序---基本理论 因为该算法是Divide-And-Conquer思想的一个实现,所以本文将以Divide-And-C