PHP数组几种常见的排序方式
1.冒泡排序
2.选择排序
3.插入排序
4.快速排序
-
$arr = array(28,6,19,5,43,21,10,66);//排序数组
-
/**
-
* 冒泡排序
-
* 思路分析:在需要排序的一组数中,
-
* 对当前未排序的数从前往后即相邻的数两两比较,
-
* 让较大的数往下沉 较小的数往上冒
-
* 即 当相邻的两个数进行比较后发现它们排序与要求相反就调整其两个的位置
-
*/
-
//1.冒泡排序
-
function bubble_sort($arr){
-
$tmp = $arr[0]; //记录最大数初始为第一个
-
$len = count($arr);
-
//外围循环 - 要比较周期次数(数组长度-1)
-
for ($i=1; $i < $len; $i++) {
-
//周期内两两比较次数(数组长度-1)
-
for ($j=1; $j < $len; $j++) {
-
if ($tmp > $arr[$j]) {
-
//前面大于后面数时交换位置
-
$tmp = $arr[$j-1];
-
$arr[$j-1] = $arr[$j];
-
$arr[$j] = $tmp;
-
}else{
-
//顺序保持不变 修改最大数
-
$tmp = $arr[$j];
-
}
-
}
-
}
-
return $arr;
-
}
-
//2.冒泡排序
-
function bubble_sort2($arr){
-
$len = count($arr);
-
//周期循环次数
-
for ($i=1; $i < $len; $i++) {
-
//两两比较次数
-
for ($j=0; $j < $len-$i; $j++) {
-
//前数大于后数 需要调整位置
-
if ($arr[$j] > $arr[$j+1]) {
-
$tmp = $arr[$j+1];
-
$arr[$j+1] = $arr[$j];
-
$arr[$j] = $tmp;
-
}
-
}
-
}
-
return $arr;
-
}
-
/**
-
* 选择排序
-
* 在需要排序的一组数中选出最小的一个数与第一个数交换
-
* 接下来在找出最小的一个数与第二个数进行交换
-
* 如此返回直到倒数第二个和最后一个数进行比较
-
*/
-
function select_sort($arr){
-
$len = count($arr);
-
//外层循环
-
for ($i=0; $i < $len-1; $i++) {
-
$p = $i; //初始化最小数位置
-
//内层循环(注意开始的位置在增长)
-
for ($j=$i+1; $j < $len; $j++) {
-
//发现更小的值 就记录位置
-
if ($arr[$p] > $arr[$j]) {
-
$p = $j;
-
}
-
}
-
//循环一个周期后把最小值调换到$i的位置
-
if ($p != $i) {
-
$tmp = $arr[$i];
-
$arr[$i] = $arr[$p];
-
$arr[$p] = $tmp;
-
}
-
}
-
return $arr;
-
}
-
/**
-
* 插入排序
-
* 在排序的一组数中假设前边的数是已经排好序的
-
* 现在要把N插入到前边有序数中去
-
* 使得这个N也是排好序的
-
* 如此反复直到排序完成
-
*/
-
function insert_sort($arr){
-
$len = count($arr);
-
//外层循环
-
for ($i=1; $i < $len; $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;
-
}
-
/**
-
* 快速排序
-
* 选择一个基准元素 通常为第一个或最后一个
-
* 经过一次扫描将为排序的数分为两部分
-
* 一部分比基准数小 另一部分比基准数大
-
* 这时基准数就在排序后的正确位置
-
* 递归两面所有的数 最后得到排序数据
-
*/
-
function quick_sort($arr){
-
$len = count($arr);
-
if ($len <= 1) {
-
return $arr;
-
}
-
$base_num = $arr[0]; //先定义一个基准数
-
//初始化两个基准两侧数组
-
$left_array = array();
-
$right_array = array();
-
//遍历数组 大于基准的放在右边 否则放左边
-
for ($i=1; $i < $len; $i++) {
-
if ($arr[$i] > $base_num) {
-
$left_array[] = $arr[$i];
-
}else{
-
$right_array[] = $arr[$i];
-
}
-
}
-
//同样的方式处理左右两侧数组 递归调用
-
$left_array = quick_sort($left_array);
-
$right_array = quick_sort($right_array);
-
//合并数组 并返回
-
return array_merge($left_array,array($base_num),$right_array);
-
}