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));