码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2018-05-09 22:35:03      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:现在   包含   依赖   oid   stat   shuff   div   ESS   art   

public class Quick
{
	public static void sort(Comparable[] a)
	{
		StdRandom.shuffle(a);              //消除对输入的依赖
		sort(a, 0, a.length - 1);
	}
	private static int partition(Comparable[] a, int lo, int hi)
	{	//将数组切分成a[lo..i-1], a[i], a[i+1..hi]
		int i = lo, j = hi+1;                  //左右扫描指针
		Comparable v = a[lo];                  //切分元素
		while (true)
		{	//扫描左右,检查扫描是否结束并交换元素
			while (less(a[++i], v)) if (i == hi) break;
			while (less(v, a[--j])) if (j == lo) break;
			if (i >= j) break;
			exch(a, i, j);
		}
		exch(a, lo, j);                        //将v = a[j]放入正确的位置
		return j;                              //a[lo..j-1] <= a[j] <= a[j+1..hi] 达成
	}
	private static void sort(Comparable[] a, int lo, int hi)
	{
		if (hi <= lo) return;
		int j = partition(a, lo, hi);      //切分
		sort(a, lo, j-1);                  //将左半部分a[lo .. j-1]排序
		sort(a, j+1, hi);                  //将右半部分a[j+1 .. hi]排序
	}
}

  其中partition()函数保证每个数组的首个元素a[0]在整个数组中的排序位置是正确的,并以此值为界将数组分成两个不包含它的数组在分别进行排序,如此迭代,完成排序。

三向切分的快速排序

  在处理含有大量重复元素的数组时,使用三向切分,将数组切分为小于、等于和大于切分元素的三个小数组,可以提高算法的速度。

public class Quick3way
{
	public static void sort(Comparable[] a, int lo, int hi)
	{
		StdRandom.shuffle(a);              //消除对输入的依赖
		sort(a, 0, a.length - 1);
	}
	
	private static void sort(Comparable[] a, int lo, int hi)
	{
		if (hi <= lo) return;
		int lt = lo, i = lo+1, gt = hi;
		Comparable v = a[lo];
		while (i <= gt)
		{
			int cmp = a[i].compareTo(v);
			if (cmp < 0) exch(a, lt++, i++);
			else if (cmp > 0) exch(a, i, gt--);
			else i++;
		} //现在a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi]成立
		sort(a, gt + 1, hi);
	}
}

  

快速排序

标签:现在   包含   依赖   oid   stat   shuff   div   ESS   art   

原文地址:https://www.cnblogs.com/auhz/p/9016783.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!