排序算法
以PHP为例列举几种常见的排序算法
常见的排序算法
提示:以下是本篇文章正文内容,下面案例可供参考
一、冒泡排序(Bubble sort)
整体思路:将一组数据看作一排竖着的气泡,然后让最后一个数与倒数第二个数进行比较,大的就往前移。然后用相同的方法,将倒数第二个数与倒数第三个进行比较,大的往前移,依次类推,最后本轮循环结束后,第一个元素就是最大的了,然后继续循环,得到第二个,第三个,第四个……
如下图所示:
public function BubbleSort(&$arr){ //必须是&$arr,传一个地址,如果是$arr,根据函数调用机制,排序将无法生效
$temp=0; //中间变量
$flag=false;
//外层循环控制循环次数
for($i=0;$i<count($arr)-1;$i++){
//内层循环控制每一次循环的交换
for($j=0;$j<count($arr)-1-$i;$j++){
//若前面的数比后面的数大,则交换
if($arr[$j]>$arr[$j+1]){
$temp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$temp;
$flag=true;
}
}
if(!$flag){
//已经是有序
break;
}
$flag=false;
}
return $arr;
}
二、选择排序(Selection sort)
整体思路:首先,拿第一个和后面所有的比,找出最小的那个数字,然后和第一个数互换(当然,如果是第一个最小,那么就不用互换了),接着循环,即:拿第二个和后面的比较,找出最小的数字,然后和第二个数字互换,依次类推,也就是说每次都是找出剩余最小的值。
如下图所示:
public function selectSort(&$arr){
$temp=0; //中间变量
//外层循环
for($i=0;$i<count($arr)-1;$i++){
//假设第$i个数就是最小的数
//记录假设的最小数的值
$minVal=$arr[$i];
//记录假设的最小数的下标
$minIndex=$i;
for($j=$i+1;$j<count($arr);$j++){
//如果假设的最小值,不是最小
if($minVal>$arr[$j]){
$minVal=$arr[$j];
$minIndex=$j;
}
}
//最后交换
$temp=$arr[$i];
$arr[$i]=$arr[$minIndex]; //循环外面,不能出现$j
$arr[$minIndex]=$temp;
}
return $arr;
}
三、插入排序(Insert sort)
整体思路:插入排序的基本思想是:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
如下图所示:
public function insertSort(&$arr){
//默认第一个数,即下标为0的数,已经是有序
for($i=1;$i<count($arr);$i++){
//准备插入的数
$insertVal=$arr[$i];
//准备先和$insertIndex比较
$insertIndex=$i-1;
while($insertIndex>=0&&$insertVal<$arr[$insertIndex]){
$arr[$insertIndex+1]=$arr[$insertIndex];
$insertIndex--;
}
$arr[$insertIndex+1]=$insertVal;
}
return $arr;
}
四、快速排序(Quick sort)
整体思路:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
如下图所示:
function quickSort(&$arr) {
//先判断是否需要继续进行
$length = count($arr);
if($length <= 1) {
return $arr;
}
//选择第一个元素作为基准
$base_num = $arr[0];
//遍历除了标尺外的所有元素,按照大小关系放入两个数组内
//初始化两个数组
$left_array = array(); //小于基准的
$right_array = array(); //大于基准的
for($i=1; $i<$length; $i++) {
if($base_num > $arr[$i]) {
//放入左边数组
$left_array[] = $arr[$i];
} else {
//放入右边
$right_array[] = $arr[$i];
}
}
//再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
$left_array = quickSort($left_array);
$right_array = quickSort($right_array);
//合并
return array_merge($left_array, array($base_num), $right_array);
}
五、交换排序(Exchange sort)
整体思路:就是根据数组中两个值的比较结果来对换这两个值在序列中的位置,交换排序的特点是:将值较大的向数组的尾部移动,较小的值向数组的前部移动。
如下图所示:
function exchangeSort($arr){
$len = count($arr);//获取数组长度
for ($i = 0;$i < $len - 1; $i++) {
for ($j = $i + 1; $j < $len; $j++) {
if ($arr[$j] < $arr[$i]) {
$iTemp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $iTemp;
}
}
}
return $arr;
}
总结
以上就是对几种排序算法的列举以及说明,可参考学习。