PHP
发布时间:2019-11-10 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
607_0@本文实例讲述了
php四种排序算法实现及效率分析。分享给大家供大家参
考,具体如下:
@H_
607_0@
php的四种基本排序算法为:冒泡排序、插入排序、选择排序和快速排序。
@H_
607_0@下面是我整理出来的算法
代码:
@H_
607_0@
1. 冒泡排序:
@H_
607_0@思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数来。
php;">
//简单版:
function bubbleSort($arr)
{
$n = count($arr
);
for($i=1;$i<$n;$i++)
{ //冒泡的轮数(最多$n-1轮)
for($j
=0;$j<$n-1;$j++) { //每一轮冒泡(两两比较,大者后移)
if($arr[$j] > $arr[$j+1])
{ //前者大于后者,交
换位置
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
return $arr;
}
@H_
696_14@
php;">
//改进版:
function bubbleSort($arr)
{
$n = count($arr
);
for($i=1;$i<$n;$i++)
{ //冒泡的轮数(最多$n-1轮)
$flag = 0; //是否发生位置交换的标志
for($j
=0;$j<$n-$i;$j++) { //每一轮冒泡(两两比较,大者后移)
if($arr[$j] > $arr[$j+1])
{ //前者大于后者,交
换位置
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
$flag = 1;
}
}
if($flag == 0)
{ //没有发生位置交换,排序已完成
break;
}
}
return $arr;
}
@H_
696_14@
@H_
607_0@为了提高冒泡排序算法的效率,主要需要改进的地方有:
@H_
607_0@(1)减少冒泡的轮数:当一轮冒泡排序中没有发生位置交换时表示数组已排好序了,应立即退出循环。
@H_
607_0@(2)减少每一轮比较的次数:对数组中已经排好序的部分元素不再对它们进行比较。
@H_
607_0@
2. 插入排序:
@H_
607_0@思路:假设数组前面的元素是排好序的,遍历数组
后面的元素,在已排好序的元素队列中找到合适的位置,插入其中。
php;">
function insertSort($arr)
{
$n = count($arr
);
for($i=1;$i<$n;$i++) { //从第二个元素开始插入
for($j=$i-1;$j>
=0;$j--)
{ //与前面的数比较,找到插入的位置
if($arr[$j] > $arr[$j+1])
{ //比前面的数小,交
换位置
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
} else
{ //大于或等于前面的数,表示已找到插入的位置
break;
}
}
}
return $arr;
}
@H_
696_14@
@H_
607_0@
3. 选择排序:
@H_
607_0@思路:进行多次选择,每次选出最大元素放入指定位置。
0;$i--)
{ //选择排序的轮数($n-1轮)
$pos = $i; //假设最大元素的位置
for($j
=0;$j<$i;$j++) { //每一轮:从未选择过的元素中选择最大的数
if($arr[$j] > $arr[$pos])
{ //所在位置元素比目前最大元素大,标志其位置
$pos = $
j;
}
}
if($pos
!= $i)
{ //将最大元素放入指定的位置
$tmp = $arr[$pos];
$arr[$pos] = $arr[$i];
$arr[$i] = $tmp;
}
}
return $arr;
}
@H_
696_14@
@H_
607_0@
4. 快速排序:
@H_
607_0@思路:递归算法。先选择数组的第一个元素作为标准,然后把小于或等于它和大于它的数分别放入两个数组中,对这两个数组也进行相同的处理,最后合并这两个数组和第一个元素。