PHP 常見4種排序 氣泡排序、選擇排序、插入排序、快速排序
阿新 • • 發佈:2018-11-09
1、氣泡排序
原理:對一組資料,比較相鄰數的大小,將值大的放到後面。
<?php // 氣泡排序 function bubbleOrder($arr) { $count = count($arr); $temp = 0; // 外層控制排序次數 for ($i = 0; $i < $count - 1; $i++) { // 內層控制每輪比較次數 for ($j = 0; $j < $count - 1 - $i; $j++) { if ($arr[$j] > $arr[$j + 1]) { $temp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $temp; } // print_r($arr); echo "<br>"; } } return $arr; } $arr = array(5, 2, 7, 6, 9, 3); $res = bubbleOrder($arr); var_dump($res);
2、選擇排序
原理:在一組資料中,選出最小的數與第一個位置交換,
然後在剩下的資料中在找出最小的數和第二個位置交換
然後在剩下的資料中在找出最小的數和第三個位置交換
依次類推直到倒數第二個數和最後一個數對比
<?php // 選擇排序 function selcetOrder($arr) { // 定義中間變數 $temp = 0; $count = count($arr); for ($i = 0; $i < $count - 1; $i++) { //定義最小位置 $minIndex = $i; for ($j = $i + 1; $j < $count; $j++) { if ($arr[$j] < $arr[$minIndex]) { $minIndex = $j; } } if ($i != $minIndex) { $temp = $arr[$i]; $arr[$i] = $arr[$minIndex]; $arr[$minIndex] = $temp; } } return $arr; } $arr = array(5, 2, 7, 6, 9, 3); $res = selcetOrder($arr); var_dump($res);
3、插入排序
原理: 將需要排序的書,與前面已經排好的資料從後往前進行比較,使其插入到相應的位置;
<?php // 插入排序 function insertOrder($arr) { $len = count($arr); //控制總迴圈次數 for ($i = 0; $i < $len; $i++) { $temp = $arr[$i]; for ($j = $i - 1; $j >= 0; $j--) { //從當前位置從後往前進行對比 if ($temp < $arr[$j]) { $arr[$j + 1] = $arr[$j]; $arr[$j] = $temp; }else{ break; } } } return $arr; } $arr = array(5, 2, 7, 6, 9, 3); $res = insertOrder($arr); var_dump($res);
4、快速排序
原理:初始一箇中間值(一般選擇第一個),將需要排序的陣列分成3部分,小於中間的值放左邊、中間值、大於中間值的放右邊,繼續用遞迴用相同的方式來排序左邊和右邊,最後合併陣列
<?php
// 快速排序
function quickOrder($arr)
{
// 判斷是否需要執行,下面要拿出一箇中間值
if (count($arr)<=1) {
return $arr;
}
$middle = $arr[0]; // 中間值
$left = array();
$right = array();
for ($i = 1; $i < count($arr); $i++) {
if ($middle < $arr[$i]) {
$right[] = $arr[$i];
} else {
$left[] = $arr[$i];
}
}
// 遞迴排序劃分好的2邊陣列
$left = quickOrder($left);
$right = quickOrder($right);
return array_merge($left, array($middle), $right);
}
$arr = array(5, 2, 7, 6, 9, 3);
$res = quickOrder($arr);
var_dump($res);