本篇文章將摘自前輩的總結
白話經典演算法系列之六 快速排序 快速搞定
總的說來,要直接默寫出快速排序還是有一定難度的,因為本人就自己的理解對快速排序作了下白話解釋,希望對大家理解有幫助,達到快速排序,快速搞定。
快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。
該方法的基本思想是:
雖然快速排序稱為分治法,但分治法這三個字顯然無法很好的概括快速排序的全部步驟。因此我的對快速排序作了進一步的說明:挖坑填數+分治法:
先來看例項吧,定義下面再給出(最好能用自己的話來總結定義,這樣對實現**會有幫助)。
以乙個陣列作為示例,取區間第乙個數為基準數。
初始時,i = 0; j = 9; x = a[i] = 72
由於已經將a[0]中的數儲存到x中,可以理解成在陣列a[0]上挖了個坑,可以將其它資料填充到這來。
從 j 開始向前找乙個比x小或等於x的數。
當j=8,符合條件,將a[8]挖出再填到上乙個坑a[0]中。a[0]=a[8]; i++;
這樣乙個坑a[0]就被搞定了,但又形成了乙個新坑a[8],這怎麼辦了?
簡單,再找數字來填a[8]這個坑。這次從i開始向後找乙個大於x的數,當i=3,符合條件,將a[3]挖出再填到上乙個坑中a[8]=a[3]; j - -;
陣列變為:
再重複上面的步驟,先從後向前找,再從前向後找。
從j開始向前找,當j=5,符合條件,將a[5]挖出填到上乙個坑中,a[3] = a[5]; i++;
從i開始向後找,當i=5時,由於i==j退出。
此時,i = j = 5,而a[5]剛好又是上次挖的坑,因此將x填入a[5]。
陣列變為:
可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。因此再對a[0…4]和a[6…9]這二個子區間重複上述步驟就可以了。
對挖坑填數進行總結:
void quick_sort(int a,int l,int r)
} private int adjustarray(int a,int l,int r)
if (i < j)
while (i < j && a[i] < x)
if (i < j)
} a[i] = x;
return i;
}
Java排序演算法 快速排序
一.思想 對氣泡排序演算法的一種改進。通過一趟排序將排序的資料分割成兩個部分,其中一部分的所有資料都比另一部分的所有資料都要小,然後再按此方法對這兩部分分別再進行快速排序,依次類推。實現為 開始時先設兩個變數i start,j end 以第乙個元素作為中間點,pivot num i 以j 的形式從後...
java排序演算法 快速排序
陣列 2,6,3,6,5,9,1 輸出 1 2 3 5 6 6 9 private static void paixu int arrs,int h,int e while arrs x arrs e 交換值 int m m arrs h arrs h arrs e arrs e m 2,6,3,6...
java快速排序演算法
package com.head.swift 快速排序 public class main sorts a,0,a.length 1 對陣列a進行公升序排列 輸出陣列 for int i a public static void sorts int a int left int right if i...