快速排序的一种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单例模式详解(推荐)
单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象. 懒汉式(线程不安全) 其主要表现在单例类在外 ...
随机推荐
- android手机各大分区详解
1. bootloader 当我们拿到一款手机,第一件事应该就是按下电源键开机,那么从开机到进入到桌面程序这中间发生了些什么呢,我们从下面这张简化了的手机结构图开始: 注意:该结构图并不反映手机的实 ...
- 苹果app(iOS app)的URL schemes
最近折腾iOS快捷启动应用或应用内的某个动作的神器launch center pro (LCP),发现很多国产app并没有被LCP官方收录,所以不得不想办法找到app的url schemes. 下面是 ...
- silverlight xap应用程序库
- 28.Docker介绍与目录
快速的部署和启动 docker的启动是毫秒级的.一分钟可移动几百个上千个docker的容器 docker和虚拟机的区别 虚拟机在里面独立运行完整的操作系统.资源上时间上都需要多. docker容器级别 ...
- springMVC拦截配置
1.web.xml文件配置 <!-- spring mvc --> <servlet> <servlet-name>DispatcherServlet</se ...
- LeetCode: 485 Max Consecutive Ones(easy)
题目: Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: ...
- T^TOJ - 1251 - 。◕‿◕。TMD - 欧拉函数 - 质因数分解
http://www.fjutacm.com/Problem.jsp?pid=1251 想了很久,一开始居然还直接枚举因子d,计算重复了. 首先你要找与n的最大公因子大于m的x的个数. \[\sum\ ...
- IOS按需返回刷新数据
问题描述 相信大家都会遇到过这种情况: 进入下一页面,并且在下一页面执行某一动作,返回要刷新,没有执行某一动作,返回不刷新.也就是当前页面要实现按照需求刷新页面 实现思路 在当前页面定义个Bool类型 ...
- lightoj 1034【强连通+缩点】
思路: 缩点,计算入度为0点的个数即可: #include<bits/stdc++.h> using namespace std; typedef long long LL; const ...
- [Xcode 实际操作]二、视图与手势-(2)UIView视图的层次关系
目录:[Swift]Xcode实际操作 本文将演示创建三个视图对象,其中第二个视图是第三个视图的父视图. 现在开始编写代码,实现这项功能 import UIKit class ViewControll ...