時間複雜度:o(n*logn),logn是使用分治提高了效率,缺點是越接近有序效率越低,會退化到o(n^2)
我的實現**經實測,100萬長度陣列排序時間平均約為160毫秒
基本思路:
1.基準對陣列選取乙個基準數(通常第乙個數,提高效率可以取中間的數)
2.分割槽依次比較替換後將陣列分為兩部分,在基準數字置之前的全部小於基準數,之後的全部大於基準數
3.遞迴對基準數左右兩部分子陣列遞迴使用同樣的分割槽方法,直到所有數都確定位置
我的**實現:
使用了效率較高的兩路快排(亦稱填坑法),乙個指標從前向後尋找第乙個大於基準數的位置,另乙個指標從後向前尋找第乙個小於基準數的位置,找到後交換位置(基準數的位置先被第乙個小於基準數的占用,後面全部交換完成,留下的坑位就是基準數的位置)
1 public static void sort(int arr)4 5 public static void sort(int arr, int left, intright)
9 int p =partition(arr,left,right);
10 sort(arr,left,p-1);
11 sort(arr,p+1,right);
12 }
13 14 public static int partition(int arr, int left, intright)
24 //找到後填左指標的坑,留下坑位,左指標前進一位(填哪側的坑,哪測前進,否則就重複填了)
25 if (i29 //從左向右找到第乙個大於基準值的位置
30 while (arr[i]j)
33 //找到後填右指標的坑,留下坑位,右指標前進一位
34 if(i38 }
39 //迴圈結束後,i=j,就是基準值的坑位
40 arr[i] =base;
41 returni;
42 }
排序1 快速排序演算法
經典快排思路 1.首先設定乙個分界值,通過該分界值將陣列分為左右兩個部分。2.左邊部分是小於等於分界值的資料,右邊部分是大於分界值的資料。3.左邊和右邊遞迴呼叫方法 設定分界值,劃分左邊的是小於等於分界值的資料,右邊是大於分界值的資料。舉例 4,6,2,0,3 1.選取最右邊的3作為分界值,劃分後陣...
排序演算法 1)快速排序
一 簡介 快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法 divide and conquermethod 時間複雜度為o n logn 不穩定。基本思想是 1 先從數列中取乙個數作為基準數 2 進行分割槽,把把大於基準數的所有數放在它的...
排序演算法1 快速排序
今兒閒著,實現了下一維陣列快速排序演算法。快速排序分三個步驟 參考維基百科 1.選取乙個基準值。一般以第乙個為基準 2.重新排序,所有比基準小的都放在左邊,所有比基準大的都放在右邊。排序過後,該基準處於數列中間位置。分治法中的分,以基準值為中心,分為左右兩個分割槽 3.遞迴的按照1 2兩步驟排序左右...