快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort 方法用的就是快排。

快排采用了经典的分治思想(divide and conquer):

Divide:选取一个基元X(一般选取数组第一个元素),通过某种分区操作(partitioning)将数组划分为两个部分:左半部分小于等于X,右半部分大于等于X。

Conquer: 左右两个子数组递归地调用Divide过程。

Combine:快排作为就地排序算法(in place sort),不需要任何合并操作

可以看出快排的核心部分就是划分过程(partitioning),下面以一个实例来详细解释如何划分数组(图取自于《算法导论》)

初始化:选取基元P=2,就是数组首元素。i=1,j=i+1=2 (数组下标以1开头)

循环不变量:2~i之间的元素都小于或等于P,i+1~j之间的元素都大于或等于P

循环过程:j从2到n,考察j位置的元素,如果大于等于P,就继续循环。如果小于P,就将j位置的元素(不应该出现在i+1~j这个区间)和i+1位置(交换之后仍在i+1~j区间)的元素交换位置,同时将i+1.这样就维持了循环不变量(见上述循环不变量说明)。直到j=n,完成最后一次循环操作。

要注意的是在完成循环后,还需要将i位置的元素和数组首元素交换以满足我们最先设定的要求(对应图中的第i步)。

细心的读者可能会想到另一种更直白的分区方法,即将基元取出存在另一相同大小数组中,遇到比基元小的元素就存储在数组左半部分,遇到比基元大的元素就存储在数组右半部分。这样的操作复杂度也是线性的,即Theta(n)。但是空间复杂度提高了一倍。这也是快排就地排序的优势所在。

最后附上快排的java代码实现:

public class QuickSort {private static void QuickSort(int[] array,int start,int end){if(start<end){int key=array[start];//初始化保存基元int i=start,j;//初始化i,jfor(j=start+1;j<=end;j++){if(array[j]<key)//如果此处元素小于基元,则把此元素和i+1处元素交换,并将i加1,如大于或等于基元则继续循环{int temp=array[j];array[j]=array[i+1];array[i+1]=temp;i++;}}array[start]=array[i];//交换i处元素和基元array[i]=key;QuickSort(array, start, i-1);//递归调用QuickSort(array, i+1, end);}}public static void main(String[] args){int[] array=new int[]{11,213,134,44,77,78,23,43};QuickSort(array, 0, array.length-1);for(int i=0;i<array.length;i++){System.out.println((i+1)+"th:"+array[i]);}}
}

以下是运行结果:

转载于:https://www.cnblogs.com/developerY/p/3163997.html

快速排序详解以及java实现相关推荐

  1. 常用排序:冒泡排序与快速排序详解,看完这篇就够了!风马博客

    常用排序:冒泡排序与快速排序详解. 在排序算法中,冒泡排序和快速排序可以算是排序算法入门必会的两种排序了,今天和大家来分析一下如何快速理解并掌握这两种排序.首先冒泡排序是初学者最常用的排序,所以我们先 ...

  2. 十大排序详解(java实现)

    十大排序详解(java实现) 一.十大排序算法概述 1.定义 2.分类 3.比较 4.相关概念 二.各算法原理及实现 1.冒泡排序 2.简单选择排序(Selection Sort) 3.直接插入排序( ...

  3. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

  4. Java类加载机制详解【java面试题】

    Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...

  5. java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...

    java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...

  6. java 泛型详解、Java中的泛型方法、 java泛型详解

    本文参考java 泛型详解.Java中的泛型方法. java泛型详解 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即& ...

  7. java web几百万分页_举例详解用Java实现web分页功能的方法

    举例详解用Java实现web分页功能的方法 发布于 2020-11-25| 复制链接 摘记: 分页问题是一个非常普遍的问题,开发者几乎都会遇到,这里不讨论具体如何分页,说明一下Web方式下分页的原理. ...

  8. 接口详解(JAVA)

    接口详解(JAVA) 文章目录 接口详解(JAVA) 接口 接口的定义和使用 练习 接口的细节:成员特点和接口的各种关系 接口中成员的特点 接口和类之间的关系 接口中新增方法,接口应用和适配器设计模式 ...

  9. mencoder和ffmpeg参数详解 (Java处理视频)

    本系列文章导航 Windows下FFmpeg快速入门 ffmpeg参数解释 mencoder和ffmpeg参数详解(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进行视 ...

最新文章

  1. 基于FPGrowth挖掘算法的乳腺癌中医症型关联规则挖掘
  2. label标签/标记
  3. project 模板_施工进度横道图不会做?18份计划模板收藏好,输入参数迅速成图...
  4. 常用公共前端CDN库
  5. 抽奖随机算法的技术探讨与C#实现
  6. 【EPS精品教程】EPS2016三维测图版安装教程(附EPS2016安装包下载地址)
  7. 安装可视化linux界面
  8. opc服务器协议gsd,S7-300如何通过GSD文件实现PROFIBUS DP主从通讯
  9. 嵌入式系统开发流程是怎样的?
  10. vue获取facebook用户邮箱、头像并登录
  11. import time python_import time
  12. AudioRecord的用法
  13. Hibernate criterion 方法总结
  14. 计算机学期总结与学业计划,计算机教学工作总结以及来年计划范文
  15. ssm框架访问数据库一直在转圈(请求)
  16. 转:Flutter做出剑气效果
  17. 【spark使用】4. Dataset转换算子使用
  18. android app增加内存大小,硬件不够软件来凑:如何提升Android手机运行内存?
  19. 树莓派开机启动python文件_树莓派开机自启动Py文件
  20. PBOC/EMV之持卡人验证

热门文章

  1. Java生鲜电商平台-订单配送模块的架构与设计
  2. axios发送自定义请求头的跨域解决
  3. 关于Mysql java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)的问题...
  4. 字符串的拆分以及分隔符所在不同位置的删除
  5. C#控件访问调用它的父级页面
  6. 利用反射修改final数据域
  7. HDU 1525 Euclid's Game
  8. puppet运维自动化之用户管理
  9. STL vector容器
  10. 124angular1实现无限表单(仅供自己看)