之前自学数据结构的时候看过C语言版的四种基本排序法,C语言都忘的差不多了,最近有空就用php将四种排序法重新写了一遍,复习一下日益生疏的算法。直接贴上代码。
<?php
/**
* 快速排序法
* @param array $arr int数组
* @param int $start 开始下标
* @param int $end 结束下标
*/
function quickSort(&$arr, $start, $end)
{
if($start < $end) {
$mid = partition($arr, $start, $end);
quickSort($arr, $start, $mid - 1);
quickSort($arr, $mid + 1, $end);
}
}
/**
* 快速排序法切分
* @param array int数组
* @param int $start 开始下标
* @param int $end 结束下标
* @return int
*/
function partition(&$arr, $start, $end)
{
$measure = $arr[$end];
$p = $start - 1;
for($i = $start; $i < $end; $i++) {
if($arr[$i] <= $measure) {
$p = $p + 1;
$tmp = $arr[$i];
$arr[$i] = $arr[$p];
$arr[$p] = $tmp;
}
}
$arr[$end] = $arr[$p + 1];
$arr[$p + 1] = $measure;
return $p + 1;
}
/**
* 冒泡法
* @param array $arr
* @return mixed
*/
function bubbleSort($arr)
{
$num = count($arr);
$exchangeFlag = 1;
for ($times = 0; $times < $num - 1 && $exchangeFlag; $times ++) {
$exchangeFlag = 0;
for ($pointer = 0; $pointer < $num -1 - $times; $pointer++) {
if($arr[$pointer] > $arr[$pointer + 1]) {
$tmp = $arr[$pointer + 1];
$arr[$pointer + 1] = $arr[$pointer];
$arr[$pointer] = $tmp;
$exchangeFlag = 1;
}
}
}
return $arr;
}
/**
* 选择排序
* @param array $arr
* @return array
*/
function selectSort($arr)
{
$num = count($arr);
if(!$num) return $arr;
for($i = 0; $i < $num - 1; $i ++) {
$tmp = $i;
for ($j = $i + 1; $j < $num; $j++)
{
if($arr[$tmp] > $arr[$j]) {
$tmp = $j;
}
}
if($tmp != $i) {
$cache = $arr[$tmp];
$arr[$tmp] = $arr[$i];
$arr[$i] = $cache;
}
}
return $arr;
}
/**
* 插入排序
* @param array $arr
* @return mixed
*/
function insertSort($arr)
{
$num = count($arr);
if(!$num) return $arr;
for ($i = 1; $i < $num; $i ++) {
$tmp = $arr[$i];
$a = $i - 1;
while ($a > -1 && $arr[$a] > $tmp) {
$arr[$a + 1] = $arr[$a--];
}
$arr[$a + 1] = $tmp;
}
return $arr;
}
/**
* 归并排序
* @param array $arr
* @param int $start
* @param int $end
*/
function mergeSort(&$arr, $start, $end)
{
if($start < $end) {
$mid = (int)(($start + $end) / 2);
mergeSort($arr, $start, $mid);
mergeSort($arr, $mid + 1, $end);
merge($arr, $start, $mid, $end);
}
}
/**
* 归并排序的合并操作
* @param array $arr
* @param int $start
* @param int $mid
* @param $end
*/
function merge(&$arr, $start, $mid, $end)
{
$left = $right = [];
$aNum = $mid - $start + 1;
$bNum = $end - $mid;
for($i = $start; $i < $mid + 1; $i++) {
$left[] = $arr[$i];
}
for($i = $mid + 1; $i < $end + 1; $i++) {
$right[] = $arr[$i];
}
$a = $b = 0;
$n = $start;
while ($a < $aNum && $b < $bNum) {
if($left[$a] < $right[$b]) {
$arr[$n ++] = $left[$a ++];
} else {
$arr[$n ++] = $right[$b ++];
}
}
while ($a < $aNum) {
$arr[$n ++] = $left[$a ++];
}
while ($b < $bNum) {
$arr[$n ++] = $right[$b ++];
}
}
function printInfo($info)
{
echo "=================================={$info}============================\n";
}
$arr = [2,4,5,7,1,3,19,23,16,33,12];
printInfo('original array');
print_r($arr);
printInfo('selectSort result');
print_r(selectSort($arr));
printInfo('bubbleSort result');
print_r(bubbleSort($arr));
printInfo('insertSort result');
print_r(insertSort($arr));
printInfo('quickSort result');
$qSortedArr = $arr;
quickSort($qSortedArr, 0 , count($arr) - 1);
print_r($qSortedArr);
printInfo('mergeSort result');
$mSortedArr = $arr;
mergeSort($mSortedArr, 0 , count($arr) - 1);
print_r($mSortedArr);
运行结果:
==================================original array============================
Array
(
[0] => 2
[1] => 4
[2] => 5
[3] => 7
[4] => 1
[5] => 3
[6] => 19
[7] => 23
[8] => 16
[9] => 33
[10] => 12
)
==================================selectSort result============================
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 7
[6] => 12
[7] => 16
[8] => 19
[9] => 23
[10] => 33
)
==================================bubbleSort result============================
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 7
[6] => 12
[7] => 16
[8] => 19
[9] => 23
[10] => 33
)
==================================insertSort result============================
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 7
[6] => 12
[7] => 16
[8] => 19
[9] => 23
[10] => 33
)
==================================quickSort result============================
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 7
[6] => 12
[7] => 16
[8] => 19
[9] => 23
[10] => 33
)
==================================mergeSort result============================
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 7
[6] => 12
[7] => 16
[8] => 19
[9] => 23
[10] => 33
)