快速排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014067137/article/details/80318664

1、快速排序:实现简单,适用于各种不同的输入数据且在一般应用中比其他排序算法要快得多。

快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立排序。

2、归并排序和快速排序是互补的。

归并排序:将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;

快速排序:当两个子数组都有序时整个数组也就自然有序了。


3、快速排序的关键在于切分,这个过程使得数组满足下面三个条件:

->对于某个j,a[j]已经排定;

->a[lo]到a[j-1]中的所有元素都不大于a[j];

->a[j+1]到a[hi]中的所有元素都不小于a[j].

通过递归调用切分来完成排序。

4、要完成实现,需要实现切分算法。一般策略是先随机取a[lo]作为切分元素,即那个将会被排定的元素,然后我们从数组左端开始向右端扫描直到找到一个大于等于它的元素,再从数组右端开始向左端扫描直到找到一个小于等于它的元素。这两个元素显然是没有排定的,因此我们交换他们的位置。如此继续。当两个指针相遇时,我们只需要将切分元素a[lo]和左边数组最右侧的元素a[j]交换然后返回j即可。



import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Quick {

	public static void main(String[] args) {
		//从标准输入读取字符串,将他们排序并输出
		Scanner scanner=new Scanner(System.in);
		while(scanner.hasNext()){
			String str=scanner.nextLine();
			String[] a=str.split(" ");
			if (str!=null) {
				sort(a);//排序算法
				assert isSorted(a);//测试数组是否有序
				show(a);//打印数组元素
			}
		}
		scanner.close();
	}

	@SuppressWarnings("rawtypes")
	private static void show(Comparable[] a) {
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}

	@SuppressWarnings("rawtypes")
	private static boolean isSorted(Comparable[] a) {
		for (int i = 1; i < a.length; i++) {
			if (less(a[i],a[i-1])) {
				return false;
			}
		}
		return true;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private static boolean less(Comparable v, Comparable w) {
		return v.compareTo(w)<0;
	}

	@SuppressWarnings({ "unused", "rawtypes" })
	private static void exch(Comparable[] a,int i,int j){
		Comparable t=a[i];
		a[i]=a[j];
		a[j]=t;
	}
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void sort(Comparable[] a) {
		//数组a乱序,消除对输入的影响
		List list=new ArrayList();
		for (int i = 0; i < a.length; i++) {
			list.add(a[i]);
		}
		Collections.shuffle(list);
		sort(a,0,a.length-1);
	}

	@SuppressWarnings("rawtypes")
	private static void sort(Comparable[] a, int lo, int hi) {
		// TODO Auto-generated method stub
		if (hi<=lo) {
			return;
		}
		int j=partition(a,lo,hi);
		sort(a, lo, j-1);
		sort(a, j+1, hi);
	}

	@SuppressWarnings("rawtypes")
	private static int partition(Comparable[] a, int lo, int hi) {
		// TODO Auto-generated method stub
		//将数组且分为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;//目标达成
	}

}



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页