快速排序 java

alexanderkenndy發表於2014-04-26

概念:
快速排序的基本思想是,通過一輪的排序將序列分割成獨立的兩部分,其中一部分序列的關鍵字(這裡主要用值來表示)均比另一部分關鍵字小。繼續對長度較短的序列進行同樣的分割,最後到達整體有序。在排序過程中,由於已經分開的兩部分的元素不需要進行比較,故減少了比較次數,降低了排序時間。


時間複雜度:
平均:Ο(nlogn)
最壞:O(n2)


演算法:
從數列中挑出一個元素,稱為 "基準"(pivot),
重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。


實現:

package com.alexander.sort.implementation;

public class QuickSort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] arr = { 52, 40, 90, 20, 19, 50 };
		quickSort(arr, 0, arr.length - 1);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
	}

	public static int getMiddle(int[] array, int start, int end) {
		int tmp = array[start];
		while (start < end) {
			while (start < end && array[end] > tmp) {
				end--;
			}
			array[start] = array[end];
			while (start < end && array[start] < tmp) {
				start++;
			}
			array[end] = array[start];
		}
		array[start] = tmp;
		return start;
	}

	public static void quickSort(int[] array, int start, int end) {
		if (start < end) {
			int middle = getMiddle(array, start, end);
			quickSort(array, start, middle - 1);
			quickSort(array, middle + 1, end);
		}
	}
}




理論和時間複雜度圖摘自 維基百科

附:經典排序演算法總結與實現【轉載自:小黑屋】 

http://xiaok.me/2015/08/27/%E7%BB%8F%E5%85%B8%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93%E4%B8%8E%E5%AE%9E%E7%8E%B0/


相關文章