快速排序法(quick sort)是目前所公認最快的排序方法之一(視解題的物件而定),雖然快速排序法在最差狀況下可以達o(n2),但是在多數的情況下,快速排序法的效率表現是相當不錯的。
快速排序法的基本精神是在數列中找出適當的軸心,然後將數列一分為二,分別對左邊與右邊數列進行排序,而影響快速排序法效率的正是軸心的選擇。
這邊所介紹的第乙個快速排序法版本,是在多數的教科書上所提及的版本,因為它最容易理解,也最符合軸心分割與左右進行排序的概念,適合對初學者進行講解。
解法這邊所介紹的快速演算如下:
將最左邊的數設定為軸,並記錄其值為 s
迴圈處理:
令索引 i 從數列左方往右方找,直到找到大於 s 的數
令索引 j 從數列右方往左方找,直到找到小於 s 的數
如果 i >= j,則離開迴圈
如果 i < j,則交換索引i與j兩處的值
將左側的軸與 j 進行交換
對軸左邊進行遞迴
對軸右邊進行遞迴
透過以下演演算法,則軸左邊的值都會小於s,軸右邊的值都會大於s,如此再對軸左右兩邊進行遞迴,就可以對完成排序的目的,例如下面的例項,*表示要交換的數,表示軸:
[41] 24 76* 11 45 64 21 69 19 36*
[41] 24 36 11 45* 64 21 69 19* 76
[41] 24 36 11 19 64* 21* 69 45 76
[41] 24 36 11 19 21 64 69 45 76
21 24 36 11 19 [41] 64 69 45 76
在上面的例子中,41左邊的值都比它小,而右邊的值都比它大,如此左右再進行遞迴至排序完成。
public class quicksort
private static void sort(int number,
int left, int right)
number[left] = number[j];
number[j] = s;
sort(number, left, j-1); // 對左邊進行遞迴
sort(number, j+1, right); // 對右邊進行遞迴 }}
private static void swap(int number, int i, int j)
}
關於程式演算法手動演算手推及演草
讀程式或者演算法的時候,有經驗的人可能多看幾步,但是沒有誰能看幾十甚至幾百步的,程式我們知道是一句一句執行的,在除錯的時候叫單步執行,程式是存在跳轉和分支的,在考試的時候經常要回答結果以考察對演算法的分析能力,又不能帶個筆記本到考場,所以程式要通過在草稿紙上手推,最好不要心算,手算麻煩一些,但是每一...
最小二乘法在回歸分析中的演算過程
首先,講一下什麼是回歸分析 回歸分析是對具有因果關係的變數 因變數 自變數 進行數理統計分析。當自變數與因變數確實存在某種關係時,我們所建立的回歸方程才有意義。因此,自變數的因素對因變數的 值是否有關?相關程度如何,以及判斷這種相關程度的把握性多大,就成為回歸分析中必須要解決的問題。進行相關程度分析...
常見演算法整理(二)
1 從300萬字串中找到最熱門的10條 搜尋的輸入資訊是乙個字串,統計300萬輸入資訊中的最熱門的前10條,我們每次輸入的乙個字串為不超過255byte,記憶體使用只有1g。請描述思想,寫出演算法 c語言 空間和時間複雜度。255位元組 300萬 7,5500,0000位元組 755,000k 75...