1. 程式人生 > >Java 實現快速排序法對陣列進行排序

Java 實現快速排序法對陣列進行排序

 快速排序是對氣泡排序的一種改進,其排序速度相對較快。

基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料要小,然後再按照這個方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列的目的。最壞情況的時間複雜度為O(N ^ 2),最好為O(nlog2n)。

快速排序的實現過程:假設要排序的陣列是A [1] ... A [N],首先任意選取一個數據(通常選取第一個資料)作為關鍵資料,然後將所有比他小的數放在前面,所有比他大的放在後面,這個過程稱為一次快速排序。一趟快速排序的演算法是:

  1. 設定兩個變數I,J,排序開始的時候I:= 1,J:= N;
  2. 以第一個數群元素作為關鍵資料,賦值給X,即X:= A [1];
  3. 從J開始向前搜尋,即由後開始向前搜尋(J:= J-1),找到第一個小於X的值,兩者交換;
  4. 從I開始向前搜尋,即由前開始向後搜尋(I:= I + 1),找到第一個大於X的值,兩者交換;
  5. 重複第3,4步,直到I =學家
public class quickSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] intArray = {12,11,45,6,8,43,40,57,3,20};
		System.out.println("排序前的陣列:");
		for(int i=0;i<intArray.length;i++) {
			System.out.print(" "+intArray[i]);		//輸出陣列元素
			if((i+1)%5==0)				//每5個元素一行
				System.out.println();
		}
		System.out.println();
		int[] b = quickSort(intArray,0,intArray.length-1);		//呼叫quickSort
		System.out.println("使用快速排序法後的陣列:");
		for(int i=0;i<b.length;i++) {
			System.out.print(" "+b[i]);
			if ((i+1)%5==0) {			//每5個元素一行
				System.out.println();
			}
		}
	}

	private static int[] quickSort(int[] array, int left, int right) {	//快速排序法
		// TODO Auto-generated method stub
		//如果開始點和結束點沒有重疊的時候,也就是指標沒有執行到結尾
		if (left<right-1) {
			int mid = getMiddle(array,left,right);				//重新獲取中間點
			quickSort(array,left,mid-1);
			quickSort(array,mid+1,right);
		}
		return array;
		
	}

	private static int getMiddle(int[] array, int left, int right) {
		// TODO Auto-generated method stub
		int temp;
		int mid = array[left];						//把中心置於a[0]
		while(left < right) {
			while(left < right && array[right] >= mid)
				right--;
			temp = array[right];					//將比中心點小的資料移到左邊
			array[right] = array[left];
			array[left] = temp;
			
			while(left < right && array[left] <= mid)
				left++;
			temp = array[right];					//將比中心點大的資料移到右邊
			array[right] = array[left];
			array[left] = temp;
		}
		array[left] = mid;							//中心移到正確位置
		return left;								//返回中心點
	}
	
	

}