- 归并排序是一个稳定的排序算法。
- 归并排序的时间复杂度是非常稳定的,不管是最好情况、最坏情况,还是平均情况,时间复杂度都是 O(nlogn)。
- 但是,归并排序不是原地排序算法,归并排序的空间复杂度是 O(n)。(因为归并排序的合并函数,在合并两个有序数组为一个有序数组时,需要借助额外的存储空间)
<?php //递归调用,分解数组 function mergeSort(array $arr, $p, $r) { if ($p >= $r) { return [$arr[$r]]; } $q = (int)(($p + $r) / 2); $left = mergeSort($arr, $p, $q); $right = mergeSort($arr, $q + 1, $r); return merge($left, $right); } //合并 function merge(array $left, array $right) { $tmp = []; $i = 0; $j = 0; $leftLength = count($left); $rightLength = count($right); do { if ($left[$i] <= $right[$j]) { $tmp[] = $left[$i++]; } else { $tmp[] = $right[$j++]; } } while ($i < $leftLength && $j < $rightLength); $start = $i; $end = $leftLength; $copyArr = $left; if ($j < $rightLength) { $start = $j; $end = $rightLength; $copyArr = $right; } for (; $start < $end; $start++) { $tmp[] = $copyArr[$start]; } return $tmp; } $arr = [4, 5, 6, 1, 3, 2]; $length = count($arr); $p = 0; $r = $length - 1; $result = mergeSort($arr, $p, $r); print_r($result);
- 快排是一种原地、不稳定的排序算法。
- 快排的时间复杂度也是 O(nlogn)
<?php function quickSort(array &$a) { $n = count($a); quickSortInternally($a, 0, $n - 1); } function quickSortInternally(array &$a, int $l, int $r) { if ($l >= $r) return; $q = partition($a, $l, $r); quickSortInternally($a, $l, $q - 1); quickSortInternally($a, $q + 1, $r); } function partition(&$a, $l, $r): int { $pivot = $a[$r]; $i = $l; for ($j = $l; $j < $r; ++$j) { if ($a[$j] < $pivot) { [$a[$j], $a[$i]] = [$a[$i], $a[$j]]; ++$i; } } [$a[$r], $a[$i]] = [$a[$i], $a[$r]]; return $i; } $a1 = [1, 4, 6, 2, 3, 5, 4]; $a2 = [2, 2, 2, 2]; $a3 = [4, 3, 2, 1]; $a4 = [5, -1, 9, 3, 7, 8, 3, -2, 9]; quickSort($a1); print_r($a1); quickSort($a2); print_r($a2); quickSort($a3); print_r($a3); quickSort($a4); print_r($a4);