快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。
該方法的基本思想是:
1.先數列中去除乙個數作為準基數(此處以第乙個為準基數)
2.將比這個數大的資料放在他的右邊,比他小的資料放在他的左邊,(乙個乙個資料的比較)
3.在重複第二步,知道每個區間都是左小右大
雖然快速排序稱為分治法,但分治法這三個字顯然無法很好的概括快速排序的全部步驟。因此我的對快速排序作了進一步的說明:填數法+分治法:
先看一段**
// 快速排序
static void sort(int s, int l, int r)
// 找到後賦值
if (i < j)
while (i < j && x >= s[i])
if (i < j)
}
s[i] = x;
sort(s, l, i - 1); // 遞迴呼叫
sort(s, i + 1, r);
for (int a : s)
} }public static void main(string args) ;
sort(indexs, 0, indexs.length - 1);
}
注意:
s[i++] = s[j];s[i++]並不是i加1之後的值,而是i之前的值
思考?
1.為什麼在賦值部分需要寫乙個判斷if(i原因:
因為在乙個乙個查詢基準數前面和後面的資料時,需要對下標進行相加減已獲得對應的資料,當加減後i不一定小於j了,
因此需要判斷
2.
s[i++] = s[j];s[i++]是否可以換種寫法?若可以,可換成什麼方法?
答案:在最基礎的氣泡排序中,我們可以知道賦值的方法是找小三的原則,因此也可以用找小三來賦值
以乙個陣列作為示例,取區間第乙個數為基準數。01
2345
6789
7265788
6042
8373
4885
首先定義基準數為96
從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--;
陣列變為:01
2345
6789
4865788
6042
8373
8885
i = 3; j = 7; x=72
再重複上面的步驟,(j是從前面開始找比他小的,i是從後面找比他大的),找左小右大的資料
從j開始向前找,當j=5,符合條件,將a[5]挖出填到上乙個坑中,a[3] = a[5]; i++;
從i開始向後找,當i=5時,由於i==j退出本次迴圈,(再次迴圈時所有資料重新執行,開始的i=0,j=陣列長度)。
而迴圈執行的資料為,i = j = 5,而a[5]剛好又是上次挖的坑,因此將x填入a[5]。
陣列變為:01
2345
6789
4865742
6072
8373
8885
可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。之後再每個區間每個區間的資料乙個乙個的比較.
對填數法進行總結(相當於是挖坑)
1.i =l; j = r; 將基準數挖出形成第乙個坑a[i]。
2.j--由後向前找比它小的數,找到後挖出此數填前乙個坑a[i]中。
3.i++由前向後找比它大的數,找到後也挖出此數填到前乙個坑a[j]中。
4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。並且退出迴圈
建議:所有資料都自己推算出來,並且乙個乙個執行出來,不要只是簡單的領悟
歡迎各位大神指正缺點!
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
演算法設計 快速排序 隨機快速排序演算法
1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...