歸併排序
歸併排序採用分治,遞迴思想。先將資料從中間分開,分成兩個部分。然後前後兩部分分別排序(繼續分,直至最後只有一個數),再合併,排序完成。
$array = [5,4,6,9,1,4,4,9];
function sortd($array){
if (count($array)>1) {
$num = count($array);
$middle = floor($num/2);
$arrLeft= array_slice($array, 0, $middle);
$arrRight= array_slice($array, $middle);
return merge(sortd($arrLeft), sortd($arrRight));
} else {
return $array;
}
}
function merge($array1, $array2) {
$newArray = [];
$index1 = 0;
$index2 = 0;
$num1 = count($array1);
$num2 = count($array2);
while ($index1<$num1 && $index2<$num2) {
$newArray[] = $array1[$index1]>$array2[$index2]?$array1[$index1++]:$array2[$index2++];
}
for ($index1; $index1<$num1; $index1++) {
$newArray[] = $array1[$index1];
}
for ($index2; $index2<$num2; $index2++) {
$newArray[] = $array2[$index2];
}
return $newArray;
}
快速排序
快速排序也是採用分治和遞迴思想;將資料找出一個數,將比小的放在一邊,比他大的放在另一邊這個數放中間。然後這兩個區域重複上一步操作,直到兩邊的數剩下一個數,排序完成。
function quickSort($arr){
$num = count($arr);
if ($num <= 1) {
return $arr;
}
$middle = $arr[0];
$leftArray = array();
$rightArray = array();
for ($i = 1; $i < $num; $i++) {
if ($arr[$i] < $middle) {
$rightArray[] = $arr[$i];
} else {
$leftArray[] = $arr[$i];
};
}
$leftArray = quickSort($leftArray);
$leftArray[] = $middle;
$rightArray = quickSort($rightArray);
return array_merge($leftArray, $rightArray);
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結