用java方式实现快速排序
一、基本思想
快速排序采用分治的策略,具体如下:选择一个关键值作为基准值,找到一个元素小于比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选用序列第一个元素作为基准值,由序列的最后一个元素从后往前扫描序列,找到一个元素值小于基准值,就将这二个值交换,然后由序列的第一个元素从前向后扫描序列,找到一个元素大于基准值,然后交换这二个值,直到从前到后的扫描索引大于等于从后到前的扫描索引。这时基准数的左边小于基准数,右边大于基准数。然后按照上述方式递归基准数左右二边的子序列,直到子序列大小为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方式实现快速排序的更多相关文章
- 使用JAVA直观感受快速排序与冒泡排序的性能差异
初学算法,肯定会编写排序算法 其中两个最为有名的就是冒泡排序和快速排序 理论上冒泡排序的时间复杂度为O(N^2),快速排序的时间复杂度为O(NlogN) 下面本门使用JAVA,分别编写三段排序程序 对 ...
- EBS中使用JAVA方式发送HTML格式邮件
转自huan.gu专栏:http://blog.csdn.net/gh320/article/details/17174769 EBS中使用JAVA方式发送HTML格式邮件 一.开发工具:JDevel ...
- 快速排序 Java实现的快速排序
快速排序 Java实现的快速排序: package xc; import java.util.Arrays; import java.util.Random; /** * * @author dax ...
- 配置RedisTemplate、JedisPoolConfig、JedisConnectionFactory+自定义序列化 (xml+java方式)+使用
java方式配置RedisTemplate //spring注入ben //@Bean(name = "redisTemplate") public RedisTemplate i ...
- spring配置redis(xml+java方式)(最底层)
条件:引用好架包 <dependency> <groupId>org.springframework.data</groupId> <artifactId&g ...
- Java方式配置Spring MVC
概述 使用Java方式配置Spring MVC,以及回顾一下Spring MVC的各种用法. Spring MVC简述 关于Spring MVC的介绍网上有很多,这里就不再赘述了,只是要说一下,Spr ...
- SpringBoot-配置Java方式
SpringBoot中使用Java方式配置步骤如下: 在类上加入@Configuration注解,代表作为配置类 在该类方法上加入@Bean注解,代表将方法返回的Bean加入Spring容器 在该类中 ...
- java基础算法-快速排序
玩博客园很多年,第一次写点什么,就从基础开始吧.最近去面试,发现自己算法忘光了,赶紧复习下.以下代码自带测试类,复制进eclipse中右键 run as -->java application ...
- Java基础(49):快速排序的Java封装(含原理,完整可运行,结合VisualGo网站更好理解)
快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序.使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好.就平均时间而言,是目前被认为最 ...
随机推荐
- Halloween Costumes 玄学题
传送门 太难了,完全不懂 设\(dp[i][j]\)为第i天到第j天的最少代价 \(dp[i][j]=dp[i][j-1]+1\)(第j天多穿一件衣服) \(dp[i][j]=min(dp[i][j] ...
- HTTP GET | POST | DELETE请求
依赖: <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp& ...
- Spring Cloud学习 之 Spring Cloud Ribbon(执行流程源码分析)
Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 文章目录 分析: 总结: 分析: 在上篇文章中,我们着重分析了RestTempla ...
- Spring Cloud 学习 之 Spring Cloud Eureka(架构)
Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 文章目录 Eureka服务治理基础架构的三个核心要素: 服务治理机制: 服务提供者: ...
- webpack-常用配置知识点
webpack配置多页面 webpcak配置多页面需要在entry中配置多个,在plugins中配置多个htmlWebpackPlugin,具体如下 entry:{ "index" ...
- [hdu5215]无向图找奇偶环
题意:如标题 思路:对于奇环,一个二分图判定就ok了,有奇环<=>非二分图.对于偶环,考虑环必定出现在双联通分量里面,可以先求出图的双联通分量,对于一个双联通分量,对于双联通分量里面的每个 ...
- CentOS7 Installing Python3
最近开始学习python. python火了这么久,我终于还是跪舔它了,我是一个跟风的人,学过C.C#.JAVA.PHP,无一例外的浅尝即止,不知道我这双已经近视的眼,确认过的眼神还对不对,希望pyt ...
- 【clear linux】intel clear linux 电源状态命令
# 重启系统 $ sudo systemctl reboot # 关闭系统,切断电源 $ sudo systemctl poweroff # CPU停止工作 $ sudo systemctl halt ...
- urldecode二次编码
0x01 <?php if(eregi("hackerDJ",$_GET[id])) { echo("not allowed!"); exit(); } ...
- chrom浏览器总是将http请求强制转换成https请求
chrome://net-internals/#hsts 中 Delete domain security policies 输入该站点,将将该站点删除一下就OK. 其他浏览器: Chrome 浏览器 ...