标签:
PHP四大经典排序算法源码
--仅供参考 欢迎点评
<?php
header("Content-Type:text/html; charset=utf-8");
// ****************************************************************
//快速排序:每次取一个比较值$key(即相应数组的$arr[0]),然后依次比较数组中的数,比比较值大的放右边并重命名为$right[],比比较值小的放左边并重命名为$left[]。再递归调用函数最后将$left[],$key,$right[]合并输出。
function quickSort($arr){
$n = count($arr);
if ($n<1) {return $arr;}
//给比较值赋值
$key = $arr[0];
//声明数组左、右数组
$left = array();
$right = array();
//数组中其他的数与比较值比较并赋给$left[]或$right[].
for($i = 1;$i < $n;$i++){
if($arr[$i] <= $key){
$left[] = $arr[$i];
}else{
$right[] = $arr[$i];
}
}
//递归调用quickSort()函数排序每个子数组.
$left = quickSort($left);
$right = quickSort($right);
//最后将$left[],$key,$right[]合并输出。
return array_merge($left,array($key),$right);
}
// ****************************************************************
//冒泡排序:每次比较和交换相邻的两个数直到比较末尾,即每次比较后将当前最大的数冒泡到了最后。一共冒泡n-1次。
function bubbleSort($arr){
$n=count($arr);
if ($n<1) {return $arr;}
//冒泡趟数外循环n-1次。
for($i=0;$i<$n-1;$i++){
//每趟循环中比较和交换次数的内循环(n-(i+1))次。
for($j=$i+1;$j<$n;$j++){
//判断并将大的数交换到后面
if($arr[$i]>$arr[$j]){
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
}
return $arr;
}
// ****************************************************************
//选择排序:在数组中,将最小的数通过比较放在第一个位置,然后将剩下的数最小的放在第二个位置,知道将最大的放在最后。
function selectSort($arr){
$n = count($arr);
if ($n<1) {return $arr;}
//外层循环 先假设第一个数是最小的 并将位置赋给$m
for($i=0;$i<$n;$i++){
$m=$i;
//内循环 找出余下最小值并将位置也赋给$m
for($j=$i+1;$j<$n;$j++){
if($arr[$j]<$arr[$m]){ //$arr[$m]是动态变化的,这里不能写成了$[$i]!
$m=$j;
}
}
//比较找出的最小值是不是与该层第一个数不相等,不相等就交换,否则第一个就是最小的。
if($arr[$m]!=$arr[$i]){
$temp=$arr[$m];
$arr[$m]=$arr[$i];
$arr[$i]=$temp;
}
}
return $arr;
}
// ****************************************************************
//插入排序:
function insertSort($arr) {
$n = count($arr);
if ($n<1) {return $arr;}
for($i=1;$i<$n; $i++){
$tmp = $arr[$i];
//内层循环控制,比较并插入
for($j=$i-1;$j>=0;$j--) {
if($tmp < $arr[$j]) {
//发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
} else {
//如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
break;
}
}
}
return $arr;
}
//数组定义、赋值
$arr0 = array(23,43,45,434,-7687,990,5,111,23);
echo "原数组是:23 43 45 434 -7687 990 5 111 23<br/>";
//1.调用快速排序
$arr1 = quickSort($arr0);
echo "快速排序的结果是:";
foreach ($arr1 as $value){
echo $value." ";
}
echo "<br/>";
//2.调用冒泡排序
$arr2 = bubbleSort($arr0);
echo "冒泡排序的结果是:";
foreach ($arr2 as $value){
echo $value." ";
}
echo "<br/>";
//3.调用选择排序
$arr3=selectSort($arr0);
echo "选择排序的结果是:";
foreach ($arr3 as $value) {
echo $value." ";
}
echo "<br/>";
//4.调用插入排序
$arr4=insertSort($arr0);
echo "插入排序的结果是:";
foreach ($arr4 as $value) {
echo $value." ";
}
echo "<br/>";
?>
标签:
原文地址:http://www.cnblogs.com/wxgthinking/p/5809971.html