一、基本概念

找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

二、选择基准元

1、固定基准元

如果输入序列是随机的,处理时间是可以接受的。如果数组已经有序时,此时的分割就是一个非常不好的分割。因为每次划分只能使待排序序列减一,此时为最坏情况,快速排序沦为冒泡排序,时间复杂度为Θ(n^2)。而且,输入的数据是有序或部分有序的情况是相当常见的。因此,使用第一个元素作为基准元是非常糟糕的,应该立即放弃这种想法。

2、随机基准元

这是一种相对安全的策略。由于基准元的位置是随机的,那么产生的分割也不会总是会出现劣质的分割。在整个数组数字全相等时,仍然是最坏情况,时间复杂度是O(n^2)。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2^n)。所以随机化快速排序可以对于绝大多数输入数据达到O(n×log(n))的期望时间复杂度。

3、三数取中

最佳的划分是将待排序的序列分成等长的子序列,最佳的状态我们可以使用序列的中间的值,也就是第N/2个数。可是,这很难算出来,并且会明显减慢快速排序的速度。这样的中值的估计可以通过随机选取三个元素并用它们的中值作为基准元而得到。事实上,随机性并没有多大的帮助,因此一般的做法是使用左端、右端和中心位置上的三个元素的中值作为基准元。

三、partition算法

partition算法是快速排序的核心,在学习快排之前,可以先学习一下这个算法。下面先贴代码:

public int partition(int[] num,int left,int right){

if(num==null || num.length<=0 || left<0 || right>=num.length){

return 0;

}

int prio=num[left+(right-left)/2]; //获取数组中间元素的下标

while (left<=right){ //从两端交替向中间扫描

while (num[left]

left++;

while (num[right]>prio)

right--;

if (left<=right){

swap(num,left,right); //最终将基准数归位

left++;

right--;

}

}

return left;

}

这个方法的思路是先找一个枢纽元(这个方法实现里面找的是第一个元素,具体其实大有文章不过这里先简化描述),再从数组的两边(具体从哪里到哪里由传进来额参数决定)生成两个指针left和right,每次发现左边的元素大于枢纽元则i停下来,右边的元素小于枢纽元j就停下来,并且交换这个两个数的位置。直到两个指针left,right相遇。再把枢纽元插入left的位置,也就是它应该在的位置。

这么做最后的结果是让数组的[left,right]部分呈现出2部分,枢纽元最终位置以左都是小于等于枢纽元的,以右都是大于等于枢纽元的。而枢纽元则被插入到了一个绝对正确的位置。

四、排序算法实现

package sort;

/**

* 快速排序

* 快速排序采用了分治策略。就是在一个数组中取一个基准数字,把小的数放基准的左边,大的数放基准的右边。

* 基准左边和右边分别是新的序列。在新的序列中再取一个基准数字,小的放左边,大的放右边。

* 这个里面用到的递归。我们需要三个参数,一个是数组,另外两个是序列的边界

* @author HJS

*/

public class QuickSort{

void sort(int num[],int left,int right){

if (left

int index=partition(num,left,right); //算出枢轴值

sort(num,left,index-1); //对低子表递归排序

sort(num,index+1,right); //对高子表递归排序

}

}

/**

* 调用partition(num,left,right)时,对num[]做划分,

* 并返回基准记录的位置

* @param num

* @param left

* @param right

* @return

*/

public int partition(int[] num,int left,int right){

if(num==null || num.length<=0 || left<0 || right>=num.length){

return 0;

}

int prio=num[left+(right-left)/2]; //获取数组中间元素的下标

while (left<=right){ //从两端交替向中间扫描

while (num[left]

left++;

while (num[right]>prio)

right--;

if (left<=right){

swap(num,left,right); //最终将基准数归位

left++;

right--;

}

}

return left;

}

public void swap(int[] num,int left,int right){

int temp = num[left];

num[left] = num[right];

num[right] = temp;

}

public static void main(String args[]){

int[] num={7,3,5,1,2,8,9,2,6};

new QuickSort().sort(num,0,num.length-1);

for(int n:num) {

System.out.print(n+" ");

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java 快速排序流程图_java简单快速排序实例解析相关推荐

  1. java swing流程图_Java Swing 介绍

    Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕 ...

  2. java 快速排序流程图_JAVA快速排序图解

    高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 9 3 4 5 1 ...

  3. java 策略模式例子_java策略模式实例解析

    1.策略模式概述: 策略模式(Strategy Pattern):定义一系列算法,将每个算法封装起来,并让它们可以相互替换.策略模式让算法独立于使用它的客户而变化,也称为政策模式.策略模式是一种行为型 ...

  4. java开发流程图_Java 详解 JVM 工作原理和流程

    作为一名Java使用者,掌握JVM的体系结构也是必须的. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java ...

  5. java动态代理_Java 动态代理 原理解析

    示例 需要代理的接口 public interface IHello {public void sayHello(); } 需要代理的类 public class HelloImpl implemen ...

  6. java类初始化_Java的类/实例初始化过程

    昨天看到群里面有人分享了一道题目,我答错了,于是趁机了解了下Java的类/对象初始化过程: 程序的输出见文章最后 程序A主要考察的是 类实例初始化 .简单验证了下,类实例初始化过程如下:父类实例初始化 ...

  7. java 自定义正则表达式_java中正则表达式实例详解

    Java中正则表达式运用实例(参看java中正则表达式运用详解): 测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * ...

  8. java正则表达式爬虫_Java简单爬虫系列(3)---正则表达式和Java正则API的使用

    上一篇内容写了如何请求资源,那么资源请求下载之后我们就要对它就行解析了,解析之前我们先熟悉一下正则表达式 正则表达式在平常使用时还是很广泛的,比如说表单输入验证,验证手机号邮箱之类,Java的字符串匹 ...

  9. java swing 示例_JAVA简单Swing图形界面应用演示样例

    JAVA简单Swing图形界面应用演示样例 package org.rui.hello; import javax.swing.JFrame; /** * 简单的swing窗体 * @author l ...

  10. java 高效加减乘除_java简单加减乘除

    展开全部 使用BigDecimal并且一定要e68a84e8a2ad3231313335323631343130323136353331333361303564用String来够造. 实现方法如下: ...

最新文章

  1. HttpClient 详解一《C#高级编程(第9版)》
  2. python下载文件到指定目录-Python获取指定文件夹下的文件名的方法
  3. html使用共同的头部导航
  4. 详解RMQ LCA
  5. dart系列之:你的地盘你做主,使用Extension对类进行扩展
  6. Web pack misc
  7. js在类的方法中访问自己的属性
  8. python中文件打开的合法模式组合_详解python中各种文件打开模式
  9. springcloud(一):大话Spring Cloud
  10. 谁才是世界上最好的 CI/CD 工具?
  11. 个人优盘更新涉密计算机病毒库,在涉密计算机和非涉密计算机之间交叉使用优盘、移动硬盘等移动存储介质时,只要及时升级杀毒软件病毒库,就不会造成泄密 - 作业在线问答...
  12. Python random模块sample、randint、shuffle、choice随机函数
  13. k2ttl救砖_斐讯K2T救砖或备份恢复开telnet+ssh备份教程
  14. 网络编程之OSI七层模型,讲解tcp/ip五层涉及的网络协议,网络通信实现,结合协议来看网络通信流程...
  15. 关于ARPG发展之操作和技能之泛泛而谈(转)
  16. 你喜欢试探别人的底线吗?
  17. 优质办公体验,掌上OA一机hold住全场
  18. django实现腾讯云短信sdk和redis缓存服务,手机号验证码登录,未注册直接注册登录
  19. 大厂林立,思必驰推可定制开发语音交互技术!
  20. java 日期 第几周-java 获取给定日期属于当年第几周

热门文章

  1. 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_4、快速创建SpringBoot应用之自动创建web应用...
  2. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_1_缓冲流的原理...
  3. excel的宏与VBA入门(二)——数据类型与变量
  4. tensorflow 变量共享
  5. CSS实现三角形的方法--拓展
  6. 【慢慢学算法】:八进制(vector练习)
  7. Effective C++读书笔记05
  8. Spring使用java代码配置Web.xml进行访问service
  9. spring接收ajax参数的几种方式
  10. (PPT)Linux服务器基础