php排序算法
冒泡排序
/**
* 冒泡排序
*
* @param array $value 待排序数组
* @return array
*/
function bubble($value = [])
{
$length = count($value) - 1;
// 外循环
for ($j = 0; $j < $length; ++$j) {
// 内循环
for ($i = 0; $i < $length; ++$i) {
// 如果后一个值小于前一个值,则互换位置
if ($value[$i + 1] < $value[$i]) {
$tmp = $value[$i + 1];
$value[$i + 1] = $value[$i];
$value[$i] = $tmp;
}
}
}
return $value;
}
/**
* 优化冒泡排序
*
* @param array $value 待排序数组
* @return array
*/
function bubble_better($value = [])
{
$flag = true; // 标示 排序未完成
$length = count($value)-1; // 数组长度
$index = $length; // 最后一次交换的索引位置 初始值为最后一位
while ($flag) {
$flag = false; // 假设排序已完成
for ($i=0; $i < $index; $i++) {
if ($value[$i] > $value[$i+1]) {
$flag = true; // 如果还有交换发生 则排序未完成
$last = $i; // 记录最后一次发生交换的索引位置
$tmp = $value[$i];
$value[$i] = $value[$i+1];
$value[$i+1] = $tmp;
}
}
$index = $last;
}
return $value;
}
选择排序
/**
* 选择排序.
*
* @param array $value 待排序数组
*
* @return array
*/
function select_sort(&$value=[])
{
$length = count($value)-1;
for ($i=0; $i < $length; $i++) {
$point = $i;// 最小值索引
for ($j=$i+1; $j <= $length; $j++) {
if ($value[$point] > $value[$j]) {
$point = $j;
}
}
$tmp = $value[$i];
$value[$i] = $value[$point];
$value[$point] = $tmp;
}
return $value;
}
插入排序
/**
* 插入排序.
*
* @param array $value 待排序数组
* @param integer $point 起始位置
*
* @return array
*/
function insert(&$value=[], $point=0)
{
if ($point >= count($value) - 1) {
return;
}
$next = $value[$point + 1]; // 下一个待插入值
// 从后向前遍历已排序数组
for ($i=$point; $i >= 0; --$i) {
// 如果当前已排序值大于 待插入值
// 把当前值后往后移动一位
// 继续向前遍历
if ($value[$i] > $next) {
$value[$i+1] = $value[$i];
// 如果到开头,自动到插入头位
if ($i === 0) {
$value[$i] = $next;
break;
}
continue;
}
// 如果,当前已排序值小于或等于 待插入值
// 则,在当前值后插入 当前待插入值
// 特殊:如果末尾值小于或等于待插入值 则当前值后插入本身
$value[$i+1] = $next;
break;
}
$point += 1;// 已排序末尾位置
// 递归
insert($value, $point);
return $value;
}
/**
* 插入排序 for循环版
*
* @param array $value 待排序数组
*
* @return array
*/
function insert_for($arr=array())
{
$len = count($arr);
for($i = 1; $i < $len; $i++) {
$base = $arr[$i];
for($j = $i - 1; $j >= 0; $j--) {
if ($base < $arr[$j]) {
$arr[$j + 1] = $arr[$j];
if ($j === 0) {
$arr[$j] = $base;
break;
}
continue;
}
$arr[$j + 1] = $base;
break;
}
}
return $arr;
}
快速排序
$a = array(2,13,42,34,56,23,67,365,87665,54,68,3);
function quick_sort($a)
{
// 判断是否需要运行,因下面已拿出一个中间值,这里<=1
if (count($a) <= 1) {
return $a;
}
$middle = $a[0]; // 中间值
$left = array(); // 接收小于中间值
$right = array();// 接收大于中间值
// 循环比较
for ($i=1; $i < count($a); $i++) {
if ($middle < $a[$i]) {
// 大于中间值
$right[] = $a[$i];
} else {
// 小于中间值
$left[] = $a[$i];
}
}
// 递归排序划分好的2边
$left = quick_sort($left);
$right = quick_sort($right);
// 合并排序后的数据,别忘了合并中间值
return array_merge($left, array($middle), $right);
}
print_r(quick_sort($a));

浙公网安备 33010602011771号