資料結構-排序-快速排序之隨機選取基準法
阿新 • • 發佈:2019-01-14
思想:基本的快速排序選取第一個或者最後一個元素作為基準。這樣在陣列已經有序的情況下,每次劃分將得到最壞的結果。一種比較常見的優化方法是隨機化演算法,即隨機選取一個元素作為基準。這種情況下雖然最壞情況仍然是O(n2),但最壞情況不再依賴於輸入資料,而是由於隨機函式取值不佳。實際上,隨機化快速排序得到理論最壞情況的可能性僅為1/(2n)。所以隨機化快速排序可以對於絕大多數輸入資料達到O(nlogn)的期望時間複雜度。
實現程式碼如下:
class Test{ /* * @Description : 一趟快速排序 * @param array * @param low * @param high * @return : int * @exception : * @date : 2019/1/9 11:22 */ public static int partion(int [] array,int low,int high){ int tmp=array[low]; while(low<high){ while(low<high && array[high]>tmp){ high--; } if(low>=high){ break; }else{ array[low]=array[high]; } while(low<high&&array[low]<tmp){ low++; } if(low>=high){ break; }else{ array[high]=array[low]; } } array[low]=tmp; return low; } public static void swap(int []array ,int low,int rand){ int tmp=array[low]; array[low]=array[rand]; array[rand]=tmp; } public static void quick(int [] array,int low,int high){ Random random=new Random(); int randNum=random.nextInt(high-low)+low+1; //low 和 high之間的所有隨機數 swap(array,low,randNum); int par=partion(array,low,high); //下一趟排序新的基準 if(par>low+1){ quick(array,low,par-1); } if(par<high-1){ quick(array,par+1,high); } } public static void quickSort(int [] array){ quick(array,0,array.length-1); } public static void main(String [] args){ int array []=new int[10000]; Random random=new Random(); for(int i=0;i<array.length;i++){ array[i]=random.nextInt(10000)+1; } quickSort(array); } }