博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速排序
阅读量:6271 次
发布时间:2019-06-22

本文共 2482 字,大约阅读时间需要 8 分钟。

hot3.png

package com.victor.sort.algorithms;import java.util.ArrayList;import com.victor.sort.seeds.*;/** * 快速排序 * @author 黑妹妹牙膏 * */public class Quick extends SortAlgorithms {	/**	Algorithm	# choose pivot	swap a[1,rand(1,n)]	# 2-way partition	k = 1	for i = 2:n, if a[i] < a[1], swap a[++k,i]	swap a[1,k]	→ invariant: a[1..k-1] < a[k] <= a[k+1..n]	# recursive sorts	sort a[1..k-1]	sort a[k+1,n]	Properties	■Not stable 	■O(lg(n)) extra space (see discussion) 	■O(n2) time, but typically O(n·lg(n)) time 	■Not adaptive 	Discussion	When carefully implemented, quick sort is robust and has low overhead. When a stable sort is not needed, quick sort is an excellent general-purpose sort -- although the 3-way partitioning version should always be used instead. 	The 2-way partitioning code shown above is written for clarity rather than optimal performance; it exhibits poor locality, and, critically, exhibits O(n2) time when there are few unique keys. A more efficient and robust 2-way partitioning method is given in Quicksort is Optimal by Robert Sedgewick and Jon Bentley. The robust partitioning produces balanced recursion when there are many values equal to the pivot, yielding probabilistic guarantees of O(n·lg(n)) time and O(lg(n)) space for all inputs. 	With both sub-sorts performed recursively, quick sort requires O(n) extra space for the recursion stack in the worst case when recursion is not balanced. This is exceedingly unlikely to occur, but it can be avoided by sorting the smaller sub-array recursively first; the second sub-array sort is a tail recursive call, which may be done with iteration instead. With this optimization, the algorithm uses O(lg(n)) extra space in the worst case. 	*/	@Override	protected ArrayList
 doSort(ArrayList
 Alist) { return sort(Alist,0,Alist.size()-1); } private ArrayList
 sort(ArrayList
 Alist,int from,int end) { if(from >= end) return Alist; ArrayList
 a = Alist; int n = end - from; //choose pivot java.util.Random rd = new java.util.Random(); int pivot = rd.nextInt(n) + from; int temp = a.get(from); a.set(from, a.get(pivot)); a.set(pivot, temp); moveMentIncrease(); // 2-way partition int k = from; for(int i=from+1;i
 a,int k,int from,int end) { System.out.println("Items after sorted:"); System.out.println("#######################################"); for(int i=0;i

转载于:https://my.oschina.net/readjava/blog/304440

你可能感兴趣的文章
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>
MaxCompute 学习计划(一)
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>
操作系统真实的虚拟内存是什么样的(一)
查看>>
hadoop、hbase、zookeeper集群搭建
查看>>
python中一切皆对象------类的基础(五)
查看>>
modprobe
查看>>
android中用ExpandableListView实现三级扩展列表
查看>>
%Error opening tftp://255.255.255.255/cisconet.cfg
查看>>
java读取excel、txt 文件内容,传到、显示到另一个页面的文本框里面。
查看>>
《从零开始学Swift》学习笔记(Day 51)——扩展构造函数
查看>>