快速排序的一种Java实现
2016-04-08 15:43
375 查看
快速排序是笔试和面试中很常见的一个考点。
快速排序是冒泡排序的升级版,时间复杂度比冒泡排序要小得多。除此之外,快速排序是不稳定的,冒泡排序是稳定的。
(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
注:此处参考了阮一峰老师的文章。
(2)「二分法」的思想,也就是「分而治之」。
(3)采用递归实现。
快速排序
第1次: [1, 2, 4, 3]
第2次: [1, 2, 3, 4]
最终结果:[1, 2, 3, 4]
快速排序是冒泡排序的升级版,时间复杂度比冒泡排序要小得多。除此之外,快速排序是不稳定的,冒泡排序是稳定的。
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.总结
快速排序采用了「二分法」的思想,采用递归实现。相比冒泡排序,时间复杂度要小很多。相关文章推荐
- 动态创建JavaBean
- 查询返回目录下的指定类型文件
- Java获取web项目路径
- JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
- Spring建立虚拟DB环境进行单测
- 偏执却管用的10条Java编程技巧
- Java OCR tesseract 图像智能字符识别技术
- JAVA之数组查询binarySearch()方法详解
- Java中如何把两个数组合并为一个
- Spring框架下PropertyPlaceholderConfigurer类配置roperties文件
- Java邮箱正则表达式
- 【lingerui+ztree】springvc 中使用的例子
- java 集合系列(2) --------------Collection
- java 多态性理解
- 216.3.20Java2注释,关键词与标识…
- SpringMVC接受复杂json数据类型
- JNI/NDK开发指南(二)——JVM查找java native方法的规则
- java
- Java并发编程:线程池的使用
- JAVA源码学习记录3---构造函数的理解