快速排序挖坑法理解與實現
阿新 • • 發佈:2019-01-01
自己實現的程式碼如下
package sort; /*快速排序 * 簡單理解為找位置排序,每趟排序都為閾值pivot找到其該放的位置,即其左邊的全都<=pivot,其右邊的全都>pivot; * 然後對左右兩邊分別遞迴執行之前的步驟; * 1 low < high 才需要排序,這個同時也是繼續遞迴的條件,若沒有則會導致無線遞迴; * 2 下標R=low,L=high, 確定閾值pivot,這裡使用陣列的第一個元素array[low],pivot = array[low].賦值後low位置(也就是R)可以看做已空,虛位以待 * 3 以下所有操作都是在R < L的情況下才繼續進行,若R=L則找到了pivot在陣列中真正應該放的位置 * 4 從後往前找到 <= pivot的值,將其放在array[R] * 5 從前->後,找到>pivot的值,將其放在array[L] * 6 當R=L則找到了pivot在陣列中真正應該放的位置。array[R] = pivot; * 7 分別對array[R]左右兩邊的序列做同上的操作,即遞迴 * */ public class QuickSort { public static void quickSort2(int[] array,int low,int high){ try{ if(low < high){ //排序條件,也是遞迴條件 int R = low,L = high; int pivot = array[R];//挖出R位置的值,放入pivot //當R=L時表示找到pivot在陣列中真正應該放的位置。array[R] = pivot while(R < L){ //前<-後,從後往前找 <= pivot的值放入R while(R < L && array[L] > pivot ){ L--; } if(R < L ){ array[R] = array[L]; } //前->後,從前往後找到大於pivot的值,存入L while(R <L && array[R] <= pivot){ R++; } if(R < L){ array[L] = array[R]; } } array[L] = pivot; quickSort2(array,low,L - 1); quickSort2(array,L + 1,high); } } catch(Exception e){ e.printStackTrace(); } } //將閾值pivot放到正確的位置上,即左邊元素<=閾值pivot,右邊>閾值pivot public static void quickSort(int[] array,int low,int high){ try{ if(low < high){ //這裡是做什麼用?沒有的話high會變成-1 int position = low;//閾值的初始位置為low,即取第一個元素作為閾值。 int pivot = array[position];//取出pivot,使position空出來 int R = low,L = high; while(R < L){ //從後往前找到 <=pivot 的元素,放在R上 while(R != L && array[L] > pivot){ L--; } if(R < L){ array[R] = array[L]; R++; } //從前往後找 >pivot 的元素,放在L上,因為L的位置已空出來 while( R != L && array[R] <= pivot){ R++; } if(R < L){ array[L] = array[R]; L--; } } array[L] = pivot;//找到pivot的正確位置 quickSort(array,low,L - 1);//對左邊繼續遞迴 quickSort(array,L + 1,high);//對右邊繼續遞迴 //return R; } } catch(Exception e){ e.printStackTrace(); } } public static void main(String[] args) { int[] array = {72,6,57,88,60,42,83,73,48,85}; int[] array2 = {72,6,57,88,60,42,83,73,48,85}; quickSort(array,0,array.length - 1); for(int i :array){ System.out.print(i + ",") ; //System.out.print(i + ',') ; //--> 使用單引號會導致 加上字元,的int值 } System.out.println() ; quickSort2(array2,0,array.length - 1); for(int i :array){ System.out.print(i + ",") ; //System.out.print(i + ',') ; //--> 使用單引號會導致 加上字元,的int值 } } }