算法排序----快速排序法

首先我來講一說快速排序算法的核心思想。java

這是我在百科上找到的官方定義:經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。算法

我來具體解釋一下,實際上咱們排序的目的就是爲了讓左側的值比右側的值小,那麼咱們就能夠取一個基準值。這個基準值咱們能夠把它當作是一個序列的左側,將這個基準值從右往左進行查找,這個時候右側的起始值其實是原數組的右側值,咱們設這個下標爲right,找到一個比基準值大的值和基準值進行交換。每對比一次咱們讓right自增一。同時將right 的值代替基準值所在的下標。同理咱們這個時候在從左側向右側開始查找,設這個下標爲left,找到一個比基準值小的值和基準值進行交換,每對比一次咱們讓left自減一,同時將left的值代替基準值所在的下標(這個地方咱們注意一下,這個時候的基準值已經發生了改變實際上剛纔的那個right值。)數組

快速排序的平均時間複雜度也是:O(nlogn)。
ui

下面是一個圖例code

 


下面我將用個人代碼來解釋一下具體的算法。blog

/**
 * 快速排序法
 * @param array
 * @return
 */
public int[] quickSort(int[] array){
	if(array.length>0){
		doQuickSort(array,0,array.length-1);
	}
	return array;
}
private void doQuickSort(int[] array, int left, int right) {
	if(left<right){
		int middle = getMiddle(array,left,right);//實際的排序流程
		//運用分治法的思想對數組進行遞歸。
		doQuickSort(array, left, middle-1);
		doQuickSort(array, middle+1, right);
	}
}

首先咱們看到了快速排序我用到了遞歸的算法,將一個長序列分爲短的序列而後將每一個短的序列進行遞歸排序,將每一個短的序列排序完成後再合成長的序列對長的序列進行排序。那麼咱們來看看這個getMiddle 方法。實際上這個方法的返回值是基準值最後應該插入的位置。這個方法以下排序

/**
 * 獲取中間下標
 * @param array
 * @param left
 * @param right
 * @return
 */
private int getMiddle(int[] array, int left, int right) {
	int base = array[left];//以左側爲基數
	int index = left;//記錄基數的下標
	while(left<right){
		while(left<right&&array[right]>=base){
			right--;
		}
		array[index] = array[right];//將基數所在下標對應的值改成找到的比基數小的值
		index = right;//修改基數所在的下標位置
		array[right] = base;//將找到的比基數小的位置的值改成基數的值
		while(left<right&&array[left]<=base){
			left++;
		}
		array[index] = array[left];
		index = left;
		array[left] = base;
	}
	return index;
}
基本思路就和我上述的同樣,當left和right的值相等時,咱們就結束了整個方法,並將最終的index值返回。咱們應該注意每次引用這個方法,整個數組就會完成一次調整,調整的結果就是將傳入的序列的左側值放到它應該在這個序列中的位置。一直遞歸到最底層完成所有的排序就獲得了咱們想要的結果。