排序算法-快速排序-java

 快速排序法:java

 與它的名字同樣,快速排序法排序速度相比其餘排序而言,速度更快。數組

 排序規則:dom

 1.將數組中的一個數據做爲基準數據,比基準數小的數據放到基準數前面,比基準數大的放到基準數後面;ide

 2.建立兩個座標,一個座標從最左邊開始,一個座標從最右邊開始;ui

 3.先從右邊開始找一個比基準數小的數據,找到以後,座標停在這個位置;code

 4.再從左邊開始找一個比基準數大的數據,找到以後,座標也停在這個位置;blog

 5.交換左右座標中的數據;排序

 6.再重複以上步驟,直到左右兩邊的座標相遇;遞歸

 7.將當前右邊座標中的數據與基準數交換位置;get

 8.此時,已經完成了第一次排序。左邊的數據都比基準數小,右邊的數據都比基準數大;

 9.分別獲取左右兩邊的數據,並遞歸執行以上步驟,最終完成整個排序;

下面直接上圖,步驟都在圖裏面:

上代碼:

/**
 * 快速排序法:
 * @author chengxp
 *
 */
public class Quick {

	/**
	 * 排序入口
	 * 
	 * @param arrTarget
	 *            已被分割的數組
	 * @param beginIndex
	 *            被分割數據的開始下標位置
	 * @param endIndex
	 *            被分割數據的結束下標位置
	 */
	public static void entry(int[] arrTarget, int beginIndex, int endIndex) {

		//若只有一個數據,不用排序,直接返回
		if (beginIndex - endIndex >= 0) {
			
			return;
		}
		
		//記錄一個座標,從左邊的位置開始
		int iIndex = beginIndex;
		//記錄第二個座標,從右邊的位置開始
		int jIndex = endIndex;
		
		//將當前已切割數組中第一個數據做爲基準數據
		int target = arrTarget[beginIndex];
		
		//當左右兩邊的數據未相遇前,保持循環
		while (iIndex < jIndex) {

			//從右邊往左邊找一個小於/等於基準值的數據,記錄當前座標
			while(target < arrTarget[jIndex] && iIndex < jIndex) {
				
				jIndex--;
			}
			
			//從左邊往右邊找一個大於基準值的數據,記錄當前座標
			while(target >= arrTarget[iIndex] && iIndex < jIndex) {
				
				iIndex++;
			}
			
			//左邊和右邊的座標相遇,表示當前數組已完成了排序
			if(iIndex >= jIndex) {
				
				break;
			}
			//將左右兩邊各自座標中的數據進行交換
			DataProvider.changeEntry(arrTarget, jIndex, iIndex);
			System.out.println("changing:" + Arrays.toString(arrTarget));
		}
		
		//每次循環完成後,將基準數的數據和右邊座標中的數據進行交換
		DataProvider.changeEntry(arrTarget, beginIndex, jIndex);

		//繼續遞歸基準數左邊的數據
		entry(arrTarget, beginIndex, jIndex - 1);
		//繼續遞歸基準數右邊的數據
		entry(arrTarget, jIndex + 1, endIndex);
	}

	public static void main(String[] args) {
		int[] arrTarget = DataProvider.getRandomArray(9);
		System.out.println("before:" + Arrays.toString(arrTarget));
		Quick.entry(arrTarget, 0, arrTarget.length - 1);
		System.out.println("after:" + Arrays.toString(arrTarget));
	}
}

輸出結果:

before:[56, 99, 51, 43, 87, 55, 37, 6, 29] changing:[56, 29, 51, 43, 87, 55, 37, 6, 99] changing:[56, 29, 51, 43, 6, 55, 37, 87, 99] changing:[37, 29, 6, 43, 51, 55, 56, 87, 99] after:[6, 29, 37, 43, 51, 55, 56, 87, 99]