快速排序使用分治策略(Divide and Conquer)来把一个序列分为两个子序列。步骤为:

从序列中挑出一个元素,作为"基准"(pivot).

把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面(相同的数可以到任一边),这个称为分区(partition)操作。

对每个分区递归地进行步骤1~3,递归的结束条件是序列的大小是0或1,这时整体已经被排好序了。

快速排序是对冒泡排序的一种改进!

快速排序的代码如下:

public static void quickSort(int[] numbers,int low,int high) {

        if(low < high) {

          int middle = getMiddle(numbers,low,high); 

          quickSort(numbers, low, middle-1);   

          quickSort(numbers, middle+1, high); 

                    }

    } 

public static int getMiddle(int[] numbers, int low,int high)  {

    int temp = numbers[low];         

    while(low < high){
//高位判断 while (low < high && numbers[high] > temp) { high--; } numbers[low] = numbers[high]; // 否则情况 numbers[high] > temp 交换位置
//低位判断 while (low < high && numbers[low] < temp) { low++; } numbers[high] = numbers[low]; // 否则情况 numbers[low] > temp 交换位置 } numbers[low] = temp ; return low ; }

备注:

可以采用空位法来梳理整个过程:

比如数组ss:{4,5,7,8,6,3}

temp = ss[0] = 4 ;

排序开始可以认为数组为:{[],5,7,8,6,3} 首位被空出来,以空位代替。

1)与高位比较,有两种情况:

1.比较位上的数比temp大

此时符合数组比较规律,则数组下标自减。

2.比较位上的数比temp小

则将比较位上的数放入空位。

由于 temp =4 > ss[5] =3,将 ss[5] 放入空位,于是数组变成:{3,5,7,8,6,[]},可以认为被交换位置 ss[5] 被空出来。

2)与低位比较,也有两种情况:与高位类似。

1.比较位上的数比temp小

此时符合数组比较规律,则数组下标自增。

由于ss[0] = 3 < temp = 4 ,数组下标自增1,到ss[1],{3,5,7,8,6,[]},此时ss[1] = 5 > temp =4不再符合该判断条件!

2.比较位上的数比temp大

则将比较位上的数放入空位。

由于 ss[1] = 5 > temp =4, 则将ss[1]放入空位。此时的数组排列为:{3,[],7,8,6,5}。

在大while循环条件下,重复以上操作!最终的数组排列为:{3,[],7,8,6,5}。

将temp的值注入其中的空位,数组的排列为:{3,4,7,8,6,5}。

递归以上,可以将之看做为:{3},4,{7,8,6,5}

可得到最终排序结果。

扩展:关于快速排序与归并排序之比较?

归并排序和快速排序都使用了分治法。

对于归并排序,大量的工作是将两个子线性表进行归并,归并是在子线性表都排好序之后进行的。

对于快速排序,大量的工作是将线性表划分为两个子线性表,划分是在子线性表排好序前进行的。

在最差情况下,归并排序的效率高于快速排序,但是,在平均情况下,两者效率相同O(NlogN)。

归并排序在归并两个子数组时,需要一个临时数组,而快速排序不需要额外的数组控件,因此,快速排序的空间效率高于归并排序。

参考文章:http://blog.csdn.net/morewindows/article/details/6684558

////end

※交换排序(1)——快速排序(quick sort)的更多相关文章

  1. [算法] 快速排序 Quick Sort

    快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...

  2. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  3. 快速排序Quick sort

    快速排序Quick sort 原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归 ...

  4. Java中的经典算法之快速排序(Quick Sort)

    Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...

  5. 排序算法 - 快速排序(Quick Sort)

    算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想  ...

  6. quicksort 快速排序 quick sort

    * Java基本版 package cn.mediamix; import java.util.LinkedList; public class QuickSort { public static v ...

  7. 基础算法之快速排序Quick Sort

    原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的 ...

  8. 快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)

    冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止 ...

  9. 快速排序——Quick Sort

    基本思想:(分治) 先从数列中取出一个数作为key值: 将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边: 对左右两个小数列重复第二步,直至各区间只有1个数. 辅助理解:挖坑填数 初 ...

  10. 排序:快速排序Quick Sort

    原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序 ...

随机推荐

  1. JAVA程序员面试笔试宝典1

    1.为什么Java中有些接口没有任何方法? 这些没有任何方法声明的接口又被称为标识接口,标识接口对于实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明它的类属于一个特定的类型. 2.j ...

  2. Python学习之LeetCode刷题之路——简单题【1、7、9】

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...

  3. 如何允许WebGL从本地载入资源

    随着mono-design不断推广,用户越来越多,陆续有电话来询问“为什么3D展现的时候,是一团黑?”,针对这个问题,专门写个帖子说明原因并给出解决方案,并且在mono-design编辑器中加了判断功 ...

  4. Idea+maven+testng+reportng生成测试报告

    TestNG自带的测试报告不是很好用,所以一般结合reportng生成美观的测试报告. 首先,在pom.xml中添加testng和reportng相关依赖 <dependencies> & ...

  5. nginx代理标准配置

    #nginx开启的进程数worker_processes   4;     #4核CPU   #定义全局错误日志定义类型,[debug|info|notice|warn|crit]error_log  ...

  6. Python数据库连接池DBUtils(基于pymysql模块连接数据库)

    安装 pip3 install DBUtils DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: # BDUtils数据库链接池: 模式一:基于threaing ...

  7. Java核心技术 卷一 复习笔记(甲

    1.数据类型包含八种基本类型,其中四种整形(int/short/long/byte),两种浮点类型(float/double), 一种用于表示Unicode编码的字符类型char,一种表示真值的boo ...

  8. 04 Python基础数据类型

    目录: 1) 整型 2) 为什么使用16进制以及用在哪里 3) 浮点型 4) 字符串型 5) 布尔型 6) 查看数据类型 7) 复数型 8) input() 9) print() 10) % 格式化输 ...

  9. linux设置系统时间与各种阻塞

    前阵子做了一个P2P的通信系统,发现开机的时候和中间运行的时候会莫名报错,这个问题找了好久,后来从日志中看出来,所有节点上阻塞的操作同时超时. 而在超时左右,有新节点自动加入系统. 在新节点加入系统的 ...

  10. Java基础学习总结(77)——Java枚举再总结

    在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下 public static final int MAN = 0; public s ...