快速排序的一种Java实现
快速排序是笔试和面试中很常见的一个考点。
快速排序是冒泡排序的升级版,时间复杂度比冒泡排序要小得多。除此之外,快速排序是不稳定的,冒泡排序是稳定的。
1.原理
(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
注:此处参考了阮一峰老师的文章。
2.对原理的解读
(1)基准是可以任选的,可以从一个数组的开头选,也可以从中间选,当然也可以从最后选。总之,任意选都可以。个人认为将数组开头的元素作为基准比较容易理解。
(2)「二分法」的思想,也就是「分而治之」。
(3)采用递归实现。
3.Java实现
package com.primeton.sort; import java.util.Arrays;
/**
* 快速排序类
* @author Chen
*
*/
public class QuickSort { private static int num = 0; //比较次数,在显示方法中使用 /**
* 每轮排序结束后都显示一次
* @param a
*/
public static void show(int[] a){
num++;
System.out.println("第"+num+"次: "+Arrays.toString(a));
} /**
* 重载
* @param a
*/
public static void quickSort(int[] a){
quickSort(a,0,a.length-1);
} /**
* 快速排序
* @param a
* @param base 基准点
* @param arrEle 数组元素
*/
public static void quickSort(int[] a,int base,int arrEle){
int i, j;
i = base;
j = arrEle; if ((a == null) || (a.length == 0)){
return;
}
if(base<0 || arrEle < 0 || arrEle<base){
return;
} while (i < j) {//查找基准点下标
while (i < j && a[i] <= a[j]){ // 以数组下标base的数据为基准,从右侧开始扫描
j--;
}
if (i < j) { // 右侧扫描,找出第一个比base小的,交换位置
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
while (i < j && a[i] < a[j]){ // 左侧扫描(此时a[j]中存储着base值)
i++;
}
if (i < j) { // 找出第一个比base大的,交换位置
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
show(a); if (i - base > 1) { // 递归调用,把base前面的完成排序
quickSort(a, 0, i - 1);
}
if (arrEle - j > 1) {
quickSort(a, j + 1, arrEle); // 递归调用,把base后面的完成排序
} } /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a={2,4,1,3};
QuickSort.quickSort(a);
System.out.println("最终结果:"+Arrays.toString(a));
} }
快速排序
4.结果
原始数组:[2,4,1,3]
第1次: [1, 2, 4, 3]
第2次: [1, 2, 3, 4]
最终结果:[1, 2, 3, 4]
5.总结
快速排序采用了「二分法」的思想,采用递归实现。相比冒泡排序,时间复杂度要小很多。
快速排序的一种Java实现的更多相关文章
- 快速排序详解以及java实现
快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort 方法用的就是快排. 快排采用了经典的分治思想(divide and conquer): Divide:选取一个基元X ...
- 四种Java线程池用法解析
本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...
- [论文笔记] 一种Java遗留系统服务化切分和封装方法 (计算机学报, 2009)
李翔,怀进鹏,曾晋,高鹏. 一种Java遗留系统服务化切分和封装方法. 计算机学报, 32(9), 2009, p1084-1815 (gs:5) 1. 本文研究从Java遗留系统中切分并封装出Web ...
- 4种Java引用浅解
近期研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档.代码以及几篇文章.做个小结,如有错误,欢迎指正. 之所以想学习一下Java的几种引用类型 ...
- 三种java 去掉字符串中的重复字符函数
三种java 去掉字符串中的重复字符函数 public static void main(string[] args) { system.out.println(removerepeatedchar( ...
- 4种Java日志管理方法
java开发中常见的几种日志管理方案有以下4种: 1. Commons-logging + log4j 2. log4j 3. slf4j + log4j + commmons-logging 4. ...
- 十四种Java开发工具点评
在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具,Java菜鸟们如初入大观园的刘姥姥,看花了眼,不知该何种选择.的确,这些工具各有所长,都没有绝对完美 ...
- 工作常用4种Java线程锁的特点,性能比较、使用场景
多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...
- 9种Java单例模式详解(推荐)
单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象. 懒汉式(线程不安全) 其主要表现在单例类在外 ...
随机推荐
- POJ1904(有向图缩点+输入输出挂参考)
King's Quest Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 8311 Accepted: 3017 Cas ...
- js搜索相同类型的控件全选、取值(Checkbox)
function selectAll(obj) { if (obj.checked) { $("input[type='checkbox']").each(function () ...
- npm安装appium server路过的坑
1.因为appium服务器是用node.js开发的,所以第一步要安装nodejs. 安装后,系统默认配置的环境变量在C盘的用户目录下,为了避免以后下载的包都放在系统盘下, 配置npm下载的包存放目录和 ...
- Linux whereis 搜索命令位置
在学习 兄弟连 linux教学视频 的时候,我将所学的 linux 命令记录在我的博客中,方便自己查阅. 文件搜索命令: whereis 基础的命令 命令名称:whereis 命令的所在路径:/usr ...
- 使用fastadmin的页面异常模板
1.效果图 2.修改tp异常页面的模板文件( /thinkphp/tpl/think_exception.tpl ),将文件中的内容全部替换成下面的内容然后保存即可(若发生报错,请注意语言包问题) & ...
- Lightoj1003【判环操作】
题意: 对于n个给出字符串a,b,理解成a在b之前办好这个事情,要求n个给出两个串,a都要在b之前完成: 题意: 所以一旦出现环就不行了: 以前在写最短路的时候,spfa就有一个判环,后来写着写着写到 ...
- hdoj1253
一题简直模板的 BFS,只是三维遍历而已. #include <stdio.h> #include <iostream> #include <sstream> #i ...
- [SDOI2019] 热闹又尴尬的聚会
热闹度\(p\)子图中最小的度数,尴尬度\(q\)独立集大小,之间的约束 \[ \begin{aligned} \lfloor n/(p+1)\rfloor\le q &\rightarrow ...
- export default 和 export 的使用方式(六)
一:ES6 的导入模块方式和暴露对象方式: ES6 中导入模块使用:import 模块名称 from '模块标识符':import '表示路径': 在 ES6 中使用 export default 和 ...
- Cstring的使用
https://msdn.microsoft.com/zh-cn/aa315043 1.字符串提取函数,CString::Left.CString::Mid .CString::Right CStri ...