快速排序

快速排序背景:應該是最爲主流,應用最爲廣泛的算法了,快速排序顧名思義它的排序速度非常之快,快速排序的特點是原地排序只需要一個非常小的輔助棧,快速排序的缺點就是,快速排序非常的脆弱,在實現的時候要非常的小心才能夠避免低劣的性能,我們也在各種教訓中大大改進了快速排序的算法,使它的應用變得更加廣泛。



快速排序的性質:快速排序是一種分治的排序算法,他將一個數組分成兩個子數組,將兩部分獨立的排序。快速排序和歸併排序是互補的,歸併排序是將數組分成兩個子數組分別排序,再將兩個有序的子數組歸併以將整個數組排序;而快速排序將數組的排序方式則是當兩個子數組都有序時整個數組也就自然有序了。在第一種情況,遞歸調用發生在處理整個數組之前;在第二種情況中,遞歸調用發生在處理整個數組之後。在歸併排序中,一個數組被分成兩半;在快速排序中,切分的位置取決於數組的內容。



快速排序的代碼

package Quick;

public class Quick {

	public static void sort(Comparable[] a) {

		sort(a, 0, a.length - 1);

	}

	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);
		sort(a,j+1,hi);

	}

	private static int partition(Comparable[] a, int lo, int 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);
		return j;

	}

	public static boolean less(Comparable v, Comparable w) {
		return v.compareTo(w) < 0;
	}

	private static void exch(Comparable[] a, int i, int j) {
		Comparable t = a[i];
		a[i] = a[j];
		a[j] = t;
	}

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

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

	public static void main(String[] args) {
		String[] a = "B,D,C,A,E,G,F, ".split(",");
		sort(a);
		assert isSorted(a);
		show(a);

	}

}

想要徹底的理解快速排序,還是需要下一定功夫的,我們的快速排序裏面涉及到了一個快速切分的函數,prttition()這個函數,這個函數起的作用就是讓我們已經確定的某個j來說a[j]要確定從a[lo]到a[j-1]中所有元素都不大於a[j],a[j+1]到a[hi]中所有元素都不小於a[j]。這樣做的目的是如果我們分成的前後兩部分都是有序的,那麼我們整個數組也就是有序的了。



最後的最後吧,對我的排序類別的博客做一個總結吧,我真的對歸併排序,快速排序,還是有很多疑問的,但是目前來說不想深究了,不是敷衍了事,而是,目前算法對我來說是一種工具,我要很好的使用它,並且在日後的學習中加深對算法的印象,直至以後可以更加深入的理解算法,最後要做到改進算法。 









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章