上次總結了其他的三種演算法:選擇排序、氣泡排序和插入排序,這次總結乙個更加高效的排序演算法——快速排序法,如果想要了解其餘三種演算法,請移步c#版選擇法、冒泡法、插入法和快速排序法分析與對比
步驟:
現在我們來看看如何實現:
為什麼一定要j先找?
我們看下邊這種情況,如果i先找,那麼i和j將會在「7」相遇,這時將二者交換,那麼5的左邊就不是都比他小的數了
之後左邊再次執行之前的步驟:(右邊同理)
畫下劃線的數字是基準數,紅色的是分界點
注意:
佇列不斷的被歸為的基準數分為兩部分的時候,左右兩部分通過遞迴呼叫來完成排序,也就是說不斷的呼叫自己來完成排序
/// /// 快速排序法
///
///
///
private void button4_click(object sender, eventargs e)
for (int i = 0; i < s.length; i++)
}/// /// 快速排序過程
///
/// 陣列
/// 低位目標陣列下標
/// 高位目標陣列下邊
private static void quicksortfunction(int array, int low, int high)
}/// /// 找出關鍵值位置
///
/// 陣列
/// 低位下標
/// 高位下標
/// 關鍵值下標
private static int keyvaluepositionfunction(int array, int low, int high)
while (i < j && array[j] <= keyvalue) //從左邊開始,直至找到》=keyvalue的下標
if(i < j) //如果leftindex < rightindex,則交換左右動態下標所指定的值;當leftindex==rightindex時,跳出整個迴圈
}//當左右兩個動態下標相等時(即:左右下標指向同乙個位置),此時便可以確定keyvalue的準確位置
temp = keyvalue;
if (temp < array[j]) //當keyvalue < 左右下標同時指向的值,將keyvalue與rightindex - 1指向的值交換,並返回rightindex - 1
else //當keyvalue >= 左右下標同時指向的值,將keyvalue與rightindex指向的值交換,並返回rightindex
}
之所以快速排序法比較高效是因為他交換的位置不是相鄰的交換,而是跨度更寬的位置的交換,這樣可以更加精準的確定數的位置,演算法很有意思,希望可以學習更多的內容
排序演算法 快速排序法
1 無論是冒泡法 堆排序法還是歸併法排序,都是重複找到陣列中剩餘未排序元素的最大或最小值,然後將每次找到的最大或最小值依次放進陣列中就可以得到乙個有序的陣列。快速排序法也與其類似,但不同的是,快速排序是通過任意指定陣列中的乙個元素作為基準,比該元素大的放在右邊,比該元素小的放在左邊,這樣就可以保證指...
Python中最快的字典排序方法
def sbv0 adict,reverse false proposed at digital sanitation engineering return sorted adict.iteritems key lambda k,v v,k reverse reverse defsbv1 d,rev...
C 排序演算法 快速排序法
在閱讀此博文前,請先閱讀我的博文 排序演算法 基類設計 以了解基類的結構。在編寫 前,我們先來了解二路歸併法的排序過程 假設有乙個ilist型的集合list 集合的元素為list 0 到list n 1 n list.count 第1步 從a 0 n 1 中選擇乙個元素作為middle,該元素為支點...