5分鐘搞定快速排序

2021-08-26 02:34:20 字數 1505 閱讀 3858

直接切入主題,快速排序分為兩過程 :挖抗填數 + 分治法 

先說下分治法,顧名思義就是「分而治之」的核心思想。簡單舉個例子體會一下:現在有100個人需要按照身高排成一列。首先,定個身高基準1.7m(定得太高和太低都會打破平衡),高與1.7m的都站在一列的右端,低於1.7m的都站在一列的左端。1.7m即為左右端的分割基準。這樣左右兩端就可以同時按照身高進行排序了,排完之後合併起來不是很簡單了。這樣做,效率是不是大大提高了。01

2345

6754

6317

28定義乙個陣列a,初始時,i = 0,j = 7 ,基準值x =a [0] = 5    (也可以設定為中間乙個數,或者最後乙個數)

可以假設基準值x為乙個坑,需要用乙個數往裡面填,現在從j開始向前找乙個<=x的數。當j=6時,將a[6]挖出填入到a[0]中,即a[0]=a[6],i ++ ; 接下來a[6]成了新的坑,我們從i開始向後找乙個》x的數,當i=2時,將a[2]挖出填入到a[6]中,即a[6] = a[2],j --。

陣列變為01

2345

6724

5317

68此時,i = 2 為乙個坑,j=5,x=5。繼續上面的步驟,從j = 5向前找乙個<=x的數,當j=4時,將a[4] 挖出填入a[2],即a[2] = a[4], i++,a[4]成了新坑,我們從i =3開始向後找乙個》x的數,當i = 4 = j 時。退出!由於a[4] 是上次挖的坑,因此需要把x給它填上。

此時陣列變為01

2345

6724

1357

68觀察後,可以發現跟身高排隊一樣吧,基準值5的左邊全是小於5的 ,而右邊全是大於5的。只要將a[0-3]和a[5-7]這兩個子陣列重複上述步驟即可完成快速排序。

挖坑填數總結:

1.i =l; j = r; 將基準數挖出形成第乙個坑a[i]。

2.j--由後向前找比它小的數,找到後挖出此數填前乙個坑a[i]中。

3.i++由前向後找比它大的數,找到後也挖出此數填到前乙個坑a[j]中。

4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。

思路清晰了,**就好寫了

package algorithm;

public class quicksort

if (i < j)

while (i < j && arr[i] < x)

if (i < j)

}// 當i == j 時結束。 把基準值填入最後坑中

arr[i] = x;

// 這裡採用分治法 繼續讓兩個子陣列繼續排序

quicksort(arr, left, i - 1);

quicksort(arr, i + 1, right);

} }public static void main(string args) ;

quicksort(reourse, 0, reourse.length -1);

for (int i : reourse)

}}

5分鐘搞定快速排序

首先找到陣列中的乙個基準值 通常是中間值 遍歷陣列,如果比基準值小就放到左邊,比基準值大放到右邊 以基準值左右兩邊的子列作為新數列,不斷重複第一步和第二步 迭代法 def quick sort arr if len arr 2 return arr mid arr len arr 2 基準值 lef...

5分鐘搞定Schema

事先宣告 搞定不是精通,只是能夠運用!其實schema很簡單,之前寫過dtd,比dtd學習成本還低!最近做的專案基於檔案系統的,一堆的xml檔案,所以想寫個驗證,也方便ide操作,既然推薦schema,那就用schema d 不廢話,看xml檔案。ivan hihello 這個應該算是個比較典型的x...

5分鐘回憶快速排序

複雜度分析 給我從小到大排序!首先 瞎選 乙個值,找到其最終位置,即排好序後它在哪,並把小於它的丟左邊,大於的丟右邊。對左右子部分重複操作,直至子部分都只剩乙個元素,則所有元素都找到了其該在的位置。第乙個?如果陣列正好是從大到小的,那我每一輪都要擼 比較 n nn個數才能找到選的數應該在哪,擼n n...