作為一名合格的PHPer怎麼能不接觸到算法這個高大上的東西了,今天就來針對初學者來說一說最基礎的4種排序算法:冒泡排序、選擇排序、插入排序、快速排序(分區排序)。
冒牌排序
核心思想:比較相鄰兩個元素的大小,如果左邊大於右邊,則調換兩個元素的位置;
缺點:需要將數組中的每一個元素都進行對比,耗時較長
$array = [5,10,3,4,2,8,7,9,11];
$length = count($array);
//第一層控制循環的次數,元素有多少個就需要循壞多少次
for ($i = 1; $i < $length; $i++) {
//第二層循環比較相鄰元素的大小,調換位置
for ($j = 0; $j < $length - $i; $j++) {
if ($array[$j] > $array[$j + 1]) {
$tmp = $array[$j + 1]; //臨時保存,替換兩者位置
$array[$j + 1] = $array[$j];
$array[$j] = $tmp;
}
}
}
return $array;選擇排序
核心思想:取後一位元素與當前元素對比,然後將小的元素插入到最前位置
$array = [5,10,3,4,2,8,7,9,11];
$length = count($array);
//第一層控制循環的次數,元素有多少個就需要循壞多少次
for ($i = 0; $i < $length - 1; $i++) {
$p = $i; //假設當前元素是最小元素的下標;
//第二層循環從下一個元素開始比較
//注意這裡的開始位置是從基準元素的下一個位置開始的
//可以認為前面的元素是已經排序完成了
for ($j = $i + 1; $j < $length; $j++) {
//找到更小的元素下標
if ($array[$p] > $array[$j]) {
$p = $j;
}
}
//如果最小元素不是之前假設的元素,則調換位置
if ($p != $i) {
$tmp = $array[$p];
$array[$p] = $array[$i];
$array[$i] = $tmp;
}
}
return $array;插入排序
核心思想:每次循環中,從下一個元素開始比較,然後將最小的元素插入到數組的最前面(但是為了更好的性能,我們通常採用替換位置的方法來將最小元素位移到數組的前面)
$array = [5,10,3,4,2,8,7,9,11];
$length = count($array);
//第一層控制循環的次數,元素有多少個就需要循壞多少次
for ($i = 1; $i < $length; $i++) {
$tmp = $array[$i]; //記錄當前基準元素
//從基準元素的下一個元素開始比較
for ($j = $i - 1; $j >= 0; $j--) {
//如果下一個元素比當前基準元素要小則調換位置
if ($tmp < $array[$j]) {
$array[$j + 1] = $array[$j];
$array[$j] = $tmp;
} else {
break;
}
}
}
return $array;快速排序
核心思想:取任意元素為基準,然後二分遞歸一直執行,每次都是小的左邊,大的右邊。最後將結果合併
$array = [5,10,3,4,2,8,7,9,11];
//如果不是數組則終止執行
if (!is_array($array)) return false;
$length = count($array);
//如果數組元素小於2個則終止執行
if ($length <= 1) return $array;
$left = $right = [];
//任意取一個元素作為基準元素
//將小於該基準的元素存放進左邊
//將大於該基準的元素存放進右邊
for ($i = 1; $i < $length; $i++) {
if ($array[$i] > $array[0]) {
$right[] = $array[$i];
} else {
$left[] = $array[$i];
}
}
//遞歸執行
$left = quick_sort($left);
$right = quick_sort($right);
//將結果合併
return array_merge($left, [$array[0]], $right);最後總結
經測試,四種方法中快速排序的性能最高。數組取10000個元素,然後分別執行消耗的時間如圖所示

在實際開發中,能直接使用到這樣代碼的場景並不多,但是作為程序員缺必須掌握這種開發思想邏輯。如果只是完成了業務開發就萬事大吉的話註定後面的路子會越來越難走的。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/226278.html
微信掃一掃
支付寶掃一掃