算法(第四版)学习笔记之java实现高速排序

高速排序是一种分治的排序算法。

它将一个数组分成两个子数组。将两部分独立地排序。高速排序和归并排序是互补的,归并排序将两个子数组分别排序,并将有序的子数组归并以将整个数组排序。而高速排序则是当两个子数组有序时整个数组也就自然有序了。在高速排序中,切分的位置取决于数组的内容。

长处:

1.实现简单;

2.适用于各种不同的输入数据且在一般应用中比其它排序算法都要快得多;

3.原地排序。

4.时间复杂度为o(nlgn);

5.内循环比大多数排序算法都要短。比較次数少。

缺点:高速排序算法很脆弱。在实现时要很小心才干避免低劣的性能。


代码例如以下:

/**
 * 
 * @author seabear
 *
 */
public class QuickSort {
	
	public static boolean less(Comparable v,Comparable w)
	{
		return v.compareTo(w) < 0;
	}
	
	public static void exch(Comparable[] a,int i,int j)
	{
		Comparable temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
	
	public static void sort(Comparable[] a)
	{
		sort(a , 0 , a.length - 1);
	}
	
	public static void sort(Comparable[] a,int lo,int hi)
	{
		if(hi <= lo)
		{
			return ;
		}
		int j = partition(a,lo,hi);
		sort(a , lo , j - 1 );
		sort(a , j + 1 , hi );
	}
	
	public static int partition(Comparable[] a,int lo,int hi)
	{
		int i = lo;
		Comparable v = a[lo];
		int j = hi + 1;
		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);
		return j;
	}
	
	public static void show(Comparable[] a)
	{
		for(int i = 0 ; i < a.length ; i++)
		{
			System.out.print(a[i] + " ");
		}
		System.out.println();
	}
	
	public static void main(String[] args)
	{
		Integer[] a = new Integer[10];
		for(int i = 0; i < 10; i++)
		{
			a[i] = (int)(Math.random() * 10  + 1);
		}
		show(a);
		sort(a);
		show(a);
	}
}


posted on 2017-07-04 20:55  ljbguanli  阅读(112)  评论(0)    收藏  举报