冒泡排序
$arr = [-1, 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48, 1, 6, 8, 11, 23];
function test ($arr) {
for ($i=0; $i < count($arr); $i++) {
for ($j=0; $j < count($arr)-1-$i; $j++) {
if ($arr[$j] > $arr[$j+1]) {
$a = $arr[$j];
$arr[$j+1] = $arr[$j];
$arr[$j] = $a;
}
}
}
return $arr;
}
echo "<pre>";
print_r(test($arr));
echo "</pre>";
选择排序
$arr = [-1, 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48, 1, 6, 8, 11, 23];
function test ($arr) {
for ($i=0; $i < count($arr)-1; $i++) {
$pos = $i;
for ($j=$i+1; $j < count($arr); $j++) {
if ($arr[$pos] > $arr[$j]) {
$pos = $j;
}
}
if ($pos != $i) {
$temps = $arr[$i];
$arr[$i] = $arr[$pos];
$arr[$pos] = $temps;
}
}
return $arr;
}
echo "<pre>";
print_r(test($arr));
echo "</pre>";
二分查找
function test ($arr, $min, $max, $k, $i=0) {
$middle = intval(($min+$max)/2);
if ($min > $max) {
return -1;
}
if ($k > $arr[$middle]) {
return test($arr, $middle+1, $max, $k, $i);
} elseif ($k < $arr[$middle]) {
return test($arr, $min, $middle-1, $k, $i);
} elseif ($k == $arr[$middle]) {
return $middle;
}
}
$arr = array(1,2,3,4,5,6,7,8,27,36);
$min = 0;
$max = count($arr)-1;
echo test($arr, $min, $max, 7);
快速排序
$arr = array(25,133,452,364,5876,293,607,365,8745,534,18,33);
function test($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];
}
}
// 递归排序两边
$left = test($left);
$right = test($right);
// 合并排序后的数据,别忘了合并中间值
return array_merge($left, array($middle), $right);
}
echo "<pre>";
print_r(test($arr));
echo "</pre>";