一、基本思想

  快速排序采用分治的策略,具体如下:选择一个关键值作为基准值,找到一个元素小于比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选用序列第一个元素作为基准值,由序列的最后一个元素从后往前扫描序列,找到一个元素值小于基准值,就将这二个值交换,然后由序列的第一个元素从前向后扫描序列,找到一个元素大于基准值,然后交换这二个值,直到从前到后的扫描索引大于等于从后到前的扫描索引。这时基准数的左边小于基准数,右边大于基准数。然后按照上述方式递归基准数左右二边的子序列,直到子序列大小为1或0,整个序列就有序了。快速排序的平均空间复杂度为O(nlog2n),时间空间度为O(1),快速排序是不稳定的排序。

二、图解

三、代码实现

public class JavaSort {
public static void main(String[] args) {
int a [] =new int []{3,1,5,2,4};
System.out.println("排序前的数组:"+Arrays.toString(a));
fastSort(a, 0, a.length-1); System.out.println("排序后的数组:"+Arrays.toString(a));
} /**
*
* @param ary 未排序数组
* @param before (子)序列最前面的索引
* @param after (子)序列最后面的索引
*/
public static void fastSort(int[] ary,int before,int after ) {
int begin = before;
int end = after ;
int key = ary[before];
while(end>begin){
//从后往前比较
while(end>begin&&ary[end]>=key) //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
end--;
if(ary[end]<=key){
int temp = ary[end];
ary[end] = ary[begin];
ary[begin] = temp;
}
//从前往后比较
while(end>begin&&ary[begin]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
begin++;
if(ary[begin]>=key){
int temp = ary[begin];
ary[begin] = ary[end];
ary[end] = temp;
}
}
//此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用 //递归关键值左右二边的子序列
if(begin>before) {
fastSort(ary,before,begin-1);//递归左边子序列。 }
if(end<after ) {
fastSort(ary,end+1,after );//递归右边子序列。
}
}
}

运行结果:

用java方式实现快速排序的更多相关文章

  1. 使用JAVA直观感受快速排序与冒泡排序的性能差异

    初学算法,肯定会编写排序算法 其中两个最为有名的就是冒泡排序和快速排序 理论上冒泡排序的时间复杂度为O(N^2),快速排序的时间复杂度为O(NlogN) 下面本门使用JAVA,分别编写三段排序程序 对 ...

  2. EBS中使用JAVA方式发送HTML格式邮件

    转自huan.gu专栏:http://blog.csdn.net/gh320/article/details/17174769 EBS中使用JAVA方式发送HTML格式邮件 一.开发工具:JDevel ...

  3. 快速排序 Java实现的快速排序

    快速排序  Java实现的快速排序: package xc; import java.util.Arrays; import java.util.Random; /** * * @author dax ...

  4. 配置RedisTemplate、JedisPoolConfig、JedisConnectionFactory+自定义序列化 (xml+java方式)+使用

    java方式配置RedisTemplate //spring注入ben //@Bean(name = "redisTemplate") public RedisTemplate i ...

  5. spring配置redis(xml+java方式)(最底层)

    条件:引用好架包 <dependency> <groupId>org.springframework.data</groupId> <artifactId&g ...

  6. Java方式配置Spring MVC

    概述 使用Java方式配置Spring MVC,以及回顾一下Spring MVC的各种用法. Spring MVC简述 关于Spring MVC的介绍网上有很多,这里就不再赘述了,只是要说一下,Spr ...

  7. SpringBoot-配置Java方式

    SpringBoot中使用Java方式配置步骤如下: 在类上加入@Configuration注解,代表作为配置类 在该类方法上加入@Bean注解,代表将方法返回的Bean加入Spring容器 在该类中 ...

  8. java基础算法-快速排序

    玩博客园很多年,第一次写点什么,就从基础开始吧.最近去面试,发现自己算法忘光了,赶紧复习下.以下代码自带测试类,复制进eclipse中右键 run as -->java application ...

  9. Java基础(49):快速排序的Java封装(含原理,完整可运行,结合VisualGo网站更好理解)

    快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序.使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好.就平均时间而言,是目前被认为最 ...

随机推荐

  1. django-haystack全文检索详细教程

    前几天要用Django-haystack来实现搜索功能,网上一搜中文资源少之又少,虽说有官方文档,但相信对于我们这些英语差的同学来说要看懂真的是一件难事.特别是关于高级部分,特地找了个英语专业的来翻译 ...

  2. idea配置tomcat运行参数,防止中文乱码和内存问题

    点击选择 Edit Configurations... 修改 VM options ,参数在最后可直接复制 -Xms550m -Xmx1250m -Dfile.encoding=UTF-8

  3. vue获取当前时间 实时刷新

    需求:获取当前系统时间,在页面上展示 年月日 时分秒 ,并且实时刷新,和系统时间保持一致 第一步:在deta 里面声明两个变量第二步:把时间调用写在created() 生命周期里面,进入页面就需要调用 ...

  4. 如何 Laravel 中验证 zip 压缩包里的文件?

    在 Laravel 程序中上传文件时,请求验证可以很好验证上传的文件.你可以要求上传文件必须为 图片 , 也可以限制文件字节 大小 , 也可以根据 mime types 或者 文件扩展名 过滤文件. ...

  5. vue-infinite-scroll------vue的无线滚动插件

    vue-infinite-scroll------vue的无线滚动插件 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 V ...

  6. spring mvc 实现文件上传

    例:用户注册提交一个头像文件 第一步,创建项目 ,导入jar包 做文件上传除了要导入spring常规的jar包外,还要导入commons-fifileupload和commons-io这两个jar包. ...

  7. 学习python的第一天,python的简单知识

    python 是现如今比较火的一种编程语言.在抱着试试的态度我来进行学习下python.要学习python 要先进行环境的安装. 下面是下载链接:https://pan.baidu.com/s/1PW ...

  8. git版本控制系统小白教程(下)

    前言:本文主要介绍git版本控制系统的一些基础使用,适合小白入门,因为内容较多,会分为两部分进行分享,查看上部请点传送门. 删除文件 ​ git删除文件一般有三种情况,第一种是在工作区修改了文件,但是 ...

  9. 字符串匹配算法:Sunday算法

    背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法 ...

  10. 我的.emacs配置

    我不是大神,使用vim和emacs只是兴趣,打发空闲时间. 上代码: ;; Added by Package.el. This must come before configurations of ; ...