※交换排序(1)——快速排序(quick sort)
快速排序使用分治策略(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)的更多相关文章
- [算法] 快速排序 Quick Sort
快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...
- 基础排序算法之快速排序(Quick Sort)
快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...
- 快速排序Quick sort
快速排序Quick sort 原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归 ...
- Java中的经典算法之快速排序(Quick Sort)
Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...
- 排序算法 - 快速排序(Quick Sort)
算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想 ...
- quicksort 快速排序 quick sort
* Java基本版 package cn.mediamix; import java.util.LinkedList; public class QuickSort { public static v ...
- 基础算法之快速排序Quick Sort
原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的 ...
- 快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)
冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止 ...
- 快速排序——Quick Sort
基本思想:(分治) 先从数列中取出一个数作为key值: 将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边: 对左右两个小数列重复第二步,直至各区间只有1个数. 辅助理解:挖坑填数 初 ...
- 排序:快速排序Quick Sort
原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序 ...
随机推荐
- acedssget
大多数ObjectARX函数在处理选择集和实体时,都用名字来识别选择集或实体,该名字用一个长整型对来表示的,并对AutoCAD来维护.在ObjectARX中,该名字的类型为ads_name.在对选择集 ...
- jQuery鼠标划入划出
今天来简单的谈谈jQuery的一个划入划出的方法,.首先划入划出能想到的东西有哪些呢,. 1:hover 2:mouseenter/mouseleave 3:mouseover/mouseout. 一 ...
- 校内测之zay与银临 (day2)(只有T1)
一些与题目无关的碎碎念 推出式子来一定要化简!!!freopen不要写错!!!特判不要瞎搞!!!! 做到以上三点能高35分qwq T1 江城唱晚 你看数据那么大,显然又是一道数学题. 这里有n个种海棠 ...
- Spring学习开发之路——使用JavaBean代替EJB
Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开发.从简单性.可测试性和松耦 ...
- Hadoop Mapreduce 中的FileInputFormat类的文件切分算法和host选择算法
文件切分算法 文件切分算法主要用于确定InputSplit的个数以及每个InputSplit对应的数据段. FileInputFormat以文件为单位切分成InputSplit.对于每个文件,由以下三 ...
- Python面向对象,析构继承多态
析构: def __del__(self): print("del..run...") r1 = Role("xx") del r1 结果打印del..run. ...
- React组件设计技巧
React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...
- 虚拟机上CentOS-6.9-x86_64系统安装教程
最近想学学Linux系统如何使用,于是想用VM安装虚拟机学习一下. linux系统比较多,我这里用的是CentOS-6.9-x86_64 一.下载系统 下载地址:https://www.centos. ...
- 51nod1429 巧克力
[题解] 找一下两个面积s1,s2的2和3的因子数,把他们除掉,如果s1,s2不相等,就是-1,否则可以用s1,s2的2和3的因子数计算答案. #include<cstdio> #incl ...
- [bzoj2242][SDOI2011][计算器] (Baby-Step-Giant-Step+快速幂+exgcd)
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...