快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 ο(nlogn) 次比較。在最壞狀況下則需要 ο(n2) 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 ο(nlogn) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來。
快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。
快速排序又是一種分而治之思想在排序演算法上的典型應用。本質上來看,快速排序應該算是在氣泡排序基礎上的遞迴分治法。
快速排序的名字起的是簡單粗暴,因為一聽到這個名字你就知道它存在的意義,就是快,而且效率高!它是處理大資料最快的排序演算法之一了。雖然 worst case 的時間複雜度達到了 o(n²),但是人家就是優秀,在大多數情況下都比平均時間複雜度為 o(n logn) 的排序演算法表現要更好,可是這是為什麼呢,我也不知道。好在我的強迫症又犯了,查了 n 多資料終於在《演算法藝術與資訊學競賽》上找到了滿意的答案:
快速排序的最壞運**況是 o(n²),比如說順序數列的快排。但它的平攤期望時間是 o(nlogn),且 o(nlogn) 記號中隱含的常數因子很小,比複雜度穩定等於 o(nlogn) 的歸併排序要小很多。所以,對絕大多數順序性較弱的隨機數列而言,快速排序總是優於歸併排序。
1、從數列中挑出乙個元素,稱為 「基準」(pivot);
2、重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作;
3、遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序;
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。
基本思想:(分治)
輔助理解:挖坑填數
初始時 i = 0; j = 9; key=72
1、由於已經將a[0]中的數儲存到key中,可以理解成在陣列a[0]上挖了個坑,可以將其它資料填充到這來。
2、從j開始向前找乙個比key小的數。當j=8,符合條件,a[0] = a[8] ; i++ ; 將a[8]挖出再填到上乙個坑a[0]中。
3、這樣乙個坑a[0]就被搞定了,但又形成了乙個新坑a[8],這怎麼辦了?簡單,再找數字來填a[8]這個坑。
4、這次從i開始向後找乙個大於key的數,當i=3,符合條件,a[8] = a[3] ; j– ; 將a[3]挖出再填到上乙個坑中。
1、此時 i = 3; j = 7; key=72
2、再重複上面的步驟,先從後向前找,再從前向後找。
3、從j開始向前找,當j=5,符合條件,將a[5]挖出填到上乙個坑中,a[3] = a[5]; i++;
4、從i開始向後找,當i=5時,由於i==j退出。
5、此時,i = j = 5,而a[5]剛好又是上次挖的坑,因此將key填入a[5]。
可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。因此再對a[0…4]和a[6…9]這二個子區間重複上述步驟就可以了。
}// 如果左索引有值 則對左索引排序
if($l > 1)
// 排序後的陣列
$new_arr = $left;
// 將當前陣列第乙個放到最後
$new_arr = $arr[0];
// 如果又索引有值 則對右索引排序
if ($r > 1)
// 根據右索引的長度再次增加資料
for($i = 0;$i
return $new_arr;
}
php實現快速排序
先獲取第乙個值為關鍵字,讓i指向第乙個,j指向最後乙個,先從最後乙個找比key小的,j指向它,將它放在i指向的地方,然後i再向前走,直到找到比key大的,放在j指向的地方,就這樣迴圈,直到i j的時候,關閉迴圈。arr array 1,2,3,5,2,3,9,8,3,2,7,4,9,8,0,4,58...
PHP實現快速排序
快速排序 在無序的陣列 data中,選擇任意乙個值作為對比值,定義i為頭部檢索索引,j為尾部檢索索引,演算法步驟 1 初始化對比值 value data 0 i 1,j count data 1 2 首先從尾部開始檢索,判斷 data j 是否小於 value,若不小於則 j 繼續檢索,直到找到比 ...
PHP 實現快速排序
首先了解快速排序的原理 1 先取乙個基值,用於每次的標準定位。2 遍歷陣列,將大於基值的放到右邊陣列,小於的放到左邊陣列 3 將每次的左右陣列和基值一起合併 實現 快速排序 function quick sort array 每次取最左邊的值 key array 0 leftarr array ri...