快速排序

Posted ppwq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。

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);
	}
}

  

以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章

算法排序之堆排序

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

如何使用sublime代码片段快速输入PHP头部版本声明

代码片段如何使用CSS来快速定义多彩光标

vs2003:快速片段工具