Java 實現快速排序法對陣列進行排序
阿新 • • 發佈:2018-12-03
快速排序是對氣泡排序的一種改進,其排序速度相對較快。
基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料要小,然後再按照這個方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列的目的。最壞情況的時間複雜度為O(N ^ 2),最好為O(nlog2n)。
快速排序的實現過程:假設要排序的陣列是A [1] ... A [N],首先任意選取一個數據(通常選取第一個資料)作為關鍵資料,然後將所有比他小的數放在前面,所有比他大的放在後面,這個過程稱為一次快速排序。一趟快速排序的演算法是:
- 設定兩個變數I,J,排序開始的時候I:= 1,J:= N;
- 以第一個數群元素作為關鍵資料,賦值給X,即X:= A [1];
- 從J開始向前搜尋,即由後開始向前搜尋(J:= J-1),找到第一個小於X的值,兩者交換;
- 從I開始向前搜尋,即由前開始向後搜尋(I:= I + 1),找到第一個大於X的值,兩者交換;
- 重複第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; //返回中心點 } }