php 实现排序算法
冒泡排序
冒泡排序通过多次遍历数组,每次比较相邻元素并交换位置,将较大元素逐步移至数组末尾。
function bubbleSort($array) {
$n = count($array);
for ($i = 0; $i < $n - 1; $i++) {
for ($j = 0; $j < $n - $i - 1; $j++) {
if ($array[$j] > $array[$j + 1]) {
$temp = $array[$j];
$array[$j] = $array[$j + 1];
$array[$j + 1] = $temp;
}
}
}
return $array;
}
选择排序
选择排序每次遍历未排序部分,找到最小元素并交换到已排序部分的末尾。
function selectionSort($array) {
$n = count($array);
for ($i = 0; $i < $n - 1; $i++) {
$minIndex = $i;
for ($j = $i + 1; $j < $n; $j++) {
if ($array[$j] < $array[$minIndex]) {
$minIndex = $j;
}
}
$temp = $array[$i];
$array[$i] = $array[$minIndex];
$array[$minIndex] = $temp;
}
return $array;
}
插入排序
插入排序将数组分为已排序和未排序部分,逐个将未排序元素插入到已排序部分的正确位置。
function insertionSort($array) {
$n = count($array);
for ($i = 1; $i < $n; $i++) {
$key = $array[$i];
$j = $i - 1;
while ($j >= 0 && $array[$j] > $key) {
$array[$j + 1] = $array[$j];
$j--;
}
$array[$j + 1] = $key;
}
return $array;
}
快速排序
快速排序通过选择一个基准元素,将数组分为小于基准和大于基准的两部分,递归排序子数组。
function quickSort($array) {
if (count($array) <= 1) {
return $array;
}
$pivot = $array[0];
$left = $right = [];
for ($i = 1; $i < count($array); $i++) {
if ($array[$i] < $pivot) {
$left[] = $array[$i];
} else {
$right[] = $array[$i];
}
}
return array_merge(quickSort($left), [$pivot], quickSort($right));
}
归并排序
归并排序将数组递归拆分为子数组,排序后合并。
function mergeSort($array) {
if (count($array) <= 1) {
return $array;
}
$mid = intval(count($array) / 2);
$left = array_slice($array, 0, $mid);
$right = array_slice($array, $mid);
return merge(mergeSort($left), mergeSort($right));
}
function merge($left, $right) {
$result = [];
while (count($left) > 0 && count($right) > 0) {
if ($left[0] < $right[0]) {
$result[] = array_shift($left);
} else {
$result[] = array_shift($right);
}
}
return array_merge($result, $left, $right);
}
堆排序
堆排序利用二叉堆结构,通过构建最大堆并逐步提取最大值实现排序。
function heapSort(&$array) {
$n = count($array);
for ($i = floor($n / 2) - 1; $i >= 0; $i--) {
heapify($array, $n, $i);
}
for ($i = $n - 1; $i > 0; $i--) {
$temp = $array[0];
$array[0] = $array[$i];
$array[$i] = $temp;
heapify($array, $i, 0);
}
return $array;
}
function heapify(&$array, $n, $i) {
$largest = $i;
$left = 2 * $i + 1;
$right = 2 * $i + 2;
if ($left < $n && $array[$left] > $array[$largest]) {
$largest = $left;
}
if ($right < $n && $array[$right] > $array[$largest]) {
$largest = $right;
}
if ($largest != $i) {
$swap = $array[$i];
$array[$i] = $array[$largest];
$array[$largest] = $swap;
heapify($array, $n, $largest);
}
}






