插入排序
它的工作原理是通過構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù)续搀,在已排序序列中從后向前掃描塞琼,找到相應(yīng)位置并插入。插入排序在實(shí)現(xiàn)上禁舷,通常采用in-place排序(即只需用到O(1)的額外空間的排序)彪杉,因而在從后向前掃描過程中,需要反復(fù)把已排序元素逐步向后挪位牵咙,為最新元素提供插入空間派近。
-----維基百科
function insertion_sort($data){
$count = count($data)-1;
for($i = 0; $i<$count; $i++){
for($j = $i; $j>=0 && $data[$j+1] < $data[$j]; $j--){
list($data[$j], $data[$j+1]) = array($data[$j+1], $data[$j]);
}
}
return $data;
}
此算法最壞的時(shí)間復(fù)雜度是O(n^2)
冒泡排序
它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素洁桌,如果他們的順序錯(cuò)誤就把他們交換過來渴丸。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成
-----維基百科
function bubble_sort(&$data){
$count = count($data);
for($i = 0; $i<$count; $i++){
for($j = 0; $j<$count-1 - $i; $j++){
if ($data[$j+1] > $data[$j]){
list($data[$j], $data[$j+1]) = array($data[$j+1], $data[$j]);
}
}
}
return $data;
}
選擇排序
首先在未排序序列中找到最辛砹琛(大)元素谱轨,存放到排序序列的起始位置,然后吠谢,再從剩余未排序元素中繼續(xù)尋找最型镣(大)元素,然后放到已排序序列的末尾工坊。以此類推献汗,直到所有元素均排序完畢。
-----維基百科
function selection_sort($data){
$count = count($data)-1;
for($i = 0; $i<$count; $i++){
for($j = $i+1; $j<=$count; $j++){
if ($data[$i] < $data[$j]){
list($data[$i], $data[$j]) = array($data[$j], $data[$i]);
}
}
}
return $data;
}
快速排序
使用分治法(Divide and conquer)策略來把一個(gè)序列(list)分為兩個(gè)子序列(sub-lists)王污。
步驟為:
1罢吃、從數(shù)列中挑出一個(gè)元素,稱為"基準(zhǔn)"(pivot)昭齐,
2尿招、重新排序數(shù)列,所有比基準(zhǔn)值小的元素?cái)[放在基準(zhǔn)前面,所有比基準(zhǔn)值大的元素?cái)[在基準(zhǔn)后面(相同的數(shù)可以到任一邊)泊业。在這個(gè)分區(qū)結(jié)束之后把沼,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)操作吁伺。
3饮睬、遞歸地(recursively)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。
遞歸到最底部時(shí)篮奄,數(shù)列的大小是零或一捆愁,也就是已經(jīng)排序好了。這個(gè)算法一定會(huì)結(jié)束窟却,因?yàn)樵诿看蔚牡╥teration)中昼丑,它至少會(huì)把一個(gè)元素?cái)[到它最后的位置去。
-----維基百科
function quick_sort($data){
$length = array_count($data);
if ($length <= 1){
return $data;
}
$mid_index = $length >> 1;
$mid_value = $data[$mid_index];
$left = $right = [];
for($i = 0; $i<$length; $i++){
if ($i == $mid_index){
continue;
}
if ($data[$i] < $mid_value){
$left[] = $data[$i];
} else {
$right[] = $data[$i];
}
}
return array_merge(quick_sort($left), (array)$mid_value, quick_sort($right));
}