Quick の implementation


  快排,就像它的名字一定,风一样的快。基本上算是最快的排序算法了。快排的基本思想是选择一个切分的元素。把这个元素排序了。所有这个元素左边的元素都小于这个元素,所有这个元素右边的元素都大于这个元素。接着再把左右2个数组分别排序。

  假设你有如下数组 (所有 i  左边的对象都小于 切分对象。 所有 j  右边的对象都大于切分对象 这句话稍后有用 先知道一下)

  

  首先,我们把index = 0 的元素当作切分元素。

  从index = 1 的位置开始,找到第一个大于49的元素。发现65 大于 49 所以标记一下 i = 2

  

  接着从数组的末尾开始找第一个小于49的,发现 index = 6 的时候,value = 27 小于 49 所以mark一下

  

  现在交换i 和 j 的元素。

  

  交换之后,元素又符合刚才的定义了(所有 i  左边的对象都小于 切分对象 因为i会继续向右边寻找元素,所有现在i位置的元素必须要小于切分元素, 要不然就不符合定义 i 左边的元素都小于 切分元素)  并且 (所有 j  右边的对象都大于切分对象)

  所以可以接着往下走

  继续从i = 2的位置开始 找到 大于49的元素,找到了 i = 3的时候value = 97

  

  继续从右边开始找 发现 j = 5 的时候13 小于49 

  

  交换位置

  

  现在 i 继续前进 。停止在 index = 4 的位置, 76 大于 49

  

  j 也继续从右边往左边找。当j = 3 value = 13 小于49 

  

  i >= j 所以不用交换位置。 这个时候需要把切分元素和 j 位置的元素交换位置

  

  这个时候 index = 3 的位置就已经是排好的位置了。 49 的右边的元素都 大于49 , 49 左边的元素都小于49

  接着就可以排序 0 - 3 的元素 和 4 到 7 的元素了。

  盗一张图帮忙理解

  

  具体的实现https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/QuickSort.java

  有讲不清楚的地方,希望可以给我留言。因为感觉自己写博客并不是很很好。嘎嘎

  

  

  

排序--QuickSort 快排的更多相关文章

  1. 排序 之 快排、归并、插入 - <时间复杂度>----掌握思想和过程

    俗话说:天下武功无坚不破,唯快不破.对于算法当然也是要使用时间最短.占用空间最小的算法来实现了. 注意:我代码里面打的备注仅供参考,建议不要背模板(因为没有固定的模板),可以写一个数列按着代码跑两圈或 ...

  2. c语言中使用自带的qsort(结构体排序)+ 快排

    c中没有自带的sort函数emm 不过有自带的qsort函数 (其实用法都差不多(只是我经常以为c中有sort 头文件要用 #include <stdlib.h> 一定要重新把指针指向的值 ...

  3. Java 排序(快排,归并)

    Java 排序有Java.util.Arrays的sort方法,具体查看JDK API(一般都是用快排实现的,有的是用归并) package yxy; import java.util.Arrays; ...

  4. 排序之快排(JS)

    快速排序(Quicksort)是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分 ...

  5. QuickSort(快排)的JAVA实现

    QuickSort的JAVA实现 这是一篇算法课程的复习笔记 用JAVA对快排又实现了一遍. 先实现的是那个easy版的,每次选的排序轴都是数组的最后一个: package com.algorithm ...

  6. 普林斯顿大学算法课 Algorithm Part I Week 3 重复元素排序 - 三路快排 Duplicate Keys

    很多时候排序是为了对数据进行归类,这种排序重复值特别多 通过年龄统计人口 删除邮件列表里的重复邮件 通过大学对求职者进行排序 若使用普通的快排对重复数据进行排序,会造成N^2复杂度,但是归并排序和三路 ...

  7. 【js基础】js排序方法——快排+堆排+插排+选择排

    快排 Array.prototype.fastSort = function(){ var arr = this; function sort(left, right, arr){ if( left ...

  8. quicksort快排

    废话不多说,上代码: void quicksort(int x[], int lo, int hi){ int i = lo, j = hi; ]; while(i <= j){ while(x ...

  9. 使用Python完成排序(快排法、归并法)

    class Sort(object): def quick_sort(self, ls): self.quick_sort_helper(ls, 0, len(ls) - 1) return ls d ...

随机推荐

  1. 谈谈OKHttp的几道面试题

    来吧,今天说说常用的网络框架OKHttp,也是现在Android所用的原生网络框架(Android 4.4开始,HttpURLConnection的底层实现被Google改成了OkHttp),GOGO ...

  2. Docker(12)- docker run 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 创建一个新的容器并运行一个 ...

  3. Java入门(5)

    阅读书目:Java入门经典(第7版) 作者:罗格斯·卡登海德 protected变量只能在其所在的类,该类的子类,以及同一个包里的其他类中使用.包是一组用于完成相同目标的相关类. private变量只 ...

  4. SpringMVC 直接返回中文字符串时,出现乱码(?)的问题

    在springmvc.xml中加入下面配置得以解决. <mvc:annotation-driven> <mvc:message-converters> <bean cla ...

  5. c#视频位置

    static void Main(string[] args)        { string scoure = @"C:\Documents and Settings\Administra ...

  6. python爬虫10 b站爬取使用 selenium+ phantomJS

    但有时候 我们不想要让它打开浏览器去执行 能不能直接在代码里面运行呢 也就是说 有没有一个无形的浏览器呢 恩 phantomJS 就是 它是一个基于 WebKit 的浏览器引擎 可以做到无声无息的操作 ...

  7. ORA-00020: maximum number of processes (40) exceeded模拟会话连接数满

    问题描述:在正式生产环境中,有的库建的process和session连接数目设置的较小,导致后期满了无法连接.因为正式库无法进行停库修改,只能释放连接,做个测试模拟 1. 修改现有最大会话与进程连接数 ...

  8. Docker 运行 SQL Server 容器映像

    随着.Net Core迭代,大家也都用上了Linux用上了Docker.跟.Net经常配套使用的SQL SERVER以前一直是windows only,但是从SQL Server 2017开始已经支持 ...

  9. List/Set 泛型转换

    Type typeSet = new TypeToken<Set<Long>>() {}.getType(); Type typeList = new TypeToken< ...

  10. Docker - 解决同步容器与主机时间报错:Error response from daemon: Error processing tar file(exit status 1): invalid symlink "/usr/share/zoneinfo/UTC" -> "../usr/share/zoneinfo/Asia/Shanghai"

    问题背景 这里讲解了如何同步容器和主机的时间:https://www.cnblogs.com/poloyy/p/13967532.html 其中使用方法二 docker cp /etc/localti ...