1. 程式人生 > >演算法排序----快速排序法

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

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

這是我在百科上找到的官方定義:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

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

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

下面是一個圖例


下面我將用我的程式碼來解釋一下具體的演算法。

/**
 * 快速排序法
 * @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值返回。我們應該注意每次引用這個方法,整個陣列就會完成一次調整,調整的結果就是將傳入的序列的左側值放到它應該在這個序列中的位置。一直遞迴到最底層完成全部的排序就得到了我們想要的結果。