快速排序是笔试和面试中很常见的一个考点。
快速排序是冒泡排序的升级版,时间复杂度比冒泡排序要小得多。除此之外,快速排序是不稳定的,冒泡排序是稳定的。

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实现的更多相关文章

  1. 快速排序详解以及java实现

    快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort 方法用的就是快排. 快排采用了经典的分治思想(divide and conquer): Divide:选取一个基元X ...

  2. 四种Java线程池用法解析

    本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...

  3. [论文笔记] 一种Java遗留系统服务化切分和封装方法 (计算机学报, 2009)

    李翔,怀进鹏,曾晋,高鹏. 一种Java遗留系统服务化切分和封装方法. 计算机学报, 32(9), 2009, p1084-1815 (gs:5) 1. 本文研究从Java遗留系统中切分并封装出Web ...

  4. 4种Java引用浅解

    近期研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档.代码以及几篇文章.做个小结,如有错误,欢迎指正. 之所以想学习一下Java的几种引用类型 ...

  5. 三种java 去掉字符串中的重复字符函数

    三种java 去掉字符串中的重复字符函数 public static void main(string[] args) { system.out.println(removerepeatedchar( ...

  6. 4种Java日志管理方法

    java开发中常见的几种日志管理方案有以下4种: 1. Commons-logging + log4j 2. log4j 3. slf4j + log4j + commmons-logging 4. ...

  7. 十四种Java开发工具点评

    在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具,Java菜鸟们如初入大观园的刘姥姥,看花了眼,不知该何种选择.的确,这些工具各有所长,都没有绝对完美 ...

  8. 工作常用4种Java线程锁的特点,性能比较、使用场景

    多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...

  9. 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外 ...

随机推荐

  1. fragment error

    error:   android.view.InflateException: Binary XML file line #6: Error inflating class fragment 解决办法 ...

  2. HDU-2617

    Happy 2009 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 理解复杂的const和typedef和指针的关系

    // container.cpp : 定义控制台应用程序的入口点. //   #include "stdafx.h" #include<iostream> #inclu ...

  4. 【网络爬虫】【python】网络爬虫(三):模拟登录——伪装浏览器登录爬取过程

    一.关于抓包分析和debug Log信息 模拟登录访问需要设置request header信息,对于这个没有概念的朋友可以参见本系列前面的java版爬虫中提到的模拟登录过程,主要就是添加请求头requ ...

  5. 3-2if条件结构

    不同条件做不同的操作.例如满100就减去20 条件结构 package com.imooc.operator; public class ConditionDemo1 { public static ...

  6. myeclipse 重新关联项目和svn

    有时候重装了svn或重新定义了WorkSpaces,原项目和svn没关联了 那么 右击要提交的项目 在弹出的菜单依次:Team -->share project 在弹出的对话框里填入SVN的地址 ...

  7. Metatable In Lua 浅尝辄止

    http://www.cnblogs.com/simonw/archive/2007/01/17/622032.html 什么是Metatable Lua中Metatable这个概念, 国内将他翻译为 ...

  8. Uncaught TypeError: window.showModalDialog is not a function 谷歌

    //新版本谷歌没有window.showModalDialog,创建一个window.openif(window.showModalDialog == undefined){ window.showM ...

  9. Qt-MVC图形视图框架初识

    使用QPushButton.QLabel.QCheckBox等构成GUI的控件或自定义图形时,开发应用程序会变得很简单.但是如果想在GUI中使用数十个或者数百个图形对象,向用户完美展示控制场景,则会受 ...

  10. html标签英文全称

    更新: 2017/06/09 最近网页开发,一直会查html和css 感觉之前写的这个太杂了,现在主要是先查这个博文,然后查文档.   -------------------------------- ...