php 四种基础排序算法

一、冒泡排序

冒泡排序大概的意思是依次比较相邻的两个数,然后根据大小做出排序,直至最后两位数。由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。但其实在实际过程中也可以根据自己需要反过来用,大树往前放,小数往后放。
function bubbleSort($arr){
    $len = count($arr);
    //第一层循环
    for($i=0;$i<$len;$i++){
        //第二层循环,从当前元素下一个开始找
        for($j=$i+1;$j<$len;$j++){
            //第一个元素和下一个元素比较,如果大于下一个元素,将该元素和下一个元素交换位置
            if($arr[$i] > $arr[$j]){
                $tmp = $arr[$i];
                $arr[$i] = $arr[$j];
                $arr[$j] = $tmp;
            }
            //倒叙排列
            /*if($arr[$i] < $arr[$j]){
                $tmp = $arr[$j];
                $arr[$j] = $arr[$i];
                $arr[$i] = $tmp;*/
            }
        }
    }
    return $arr;
}
另外还有在网上还找到一种效率更高的冒泡排序写法:
function bubbleSort($arr)
{
    $len = count($arr);
    for($i=1; $i<$len; $i++)//最多做n-1趟排序
    {
        $flag = false;  //本趟排序开始前,交换标志应为假
        for($j=$len-1;$j>=$i;$j--)
        {
            if($arr[$j]<$arr[$j-1])//交换记录
            {//如果是从大到小的话,只要在这里的判断改成if($arr[$j]>$arr[$j-1])就可以了
                $x=$arr[$j];
                $arr[$j]=$arr[$j-1];
                $arr[$j-1]=$x;
                $flag = true;//发生了交换,故将交换标志置为真
            }
        }
        if(! $flag)//本趟排序未发生交换,提前终止算法
            return $arr;
    }
}

二、插入排序

网上找到一篇文章分析的很好,拿来直接用 原文地址

插入排序法的基本思路:以$arr = array(2,6,3,9)为例说明,由大到小排序。

实现原理:

假设(并不实际创建)有一个有序数组$arr = array(2),用$arr[1]=6来与它进行比较,如果6>2,由把$arr[0]后移到$arr[1]位置,而6插入到$arr[0]位置。接着,$arr[2]=3与$arr[1]=2比较,3>2,则$arr[1]=2继续后移到$arr[2]位置,原$arr[3]=3插入到$arr[1]位置,再继续把9插入到合位置,最终得到的结果是(9,6,3,2)。同样是经过 count($arr)-1 次大循环,即可实现排序。

代码规律分析:

第一次大循环:$[1]与$[0]比;
第二次大循环:$[2]与$[1]比,$[1]与$[0]比;
第三次大循环:$[3]与$[2]比,$[2]与$[1]比,$[1]与$[0]比;

function insertSort(&$arr)
{
    for ($i = 1; $i < count ($arr); $i++) {
        //$insertVal是准备插入的数
        for ($j = $i; $j > 0; $j--) {
            if ($arr[$j] > $arr[$j - 1]) {
                $insertVal = $arr[$j];
                $arr[$j] = $arr[$j - 1];
                $arr[$j - 1] = $insertVal;
            }
        }
    }
}

代码实现分析:

第一次大循环:

$i=1 数组(2,6,3,9)
$j=1 执行6和2比:$arr[1]=2;$arr[0]=6,得到(6,2,3,9)

第二次大循环:

$i=2 数组(6,2,3,9)
$j=2 执行3和2比:变成$arr[2]=2,$arr[1]=3,得到(6,3,2,9)
$j--,$j=1 执行$arr[1]和$arr[0]比:条件不成立

第三次大循环:

$i=3 数组(6,3,2,9)
$j=3 执行9和2比:变成$arr[3]=2,$arr[2]=9,得到(6,3,9,2)
$j--,$j=2 执行9和3比:变成$arr[2]=3,$arr[1]=9,得到(6,9,3,2)
$j--,$j=1 执行9和6比:变成$arr[1]=5,$arr[0]=9,得到(9,6,3,2)

三、快速排序

该篇博客详细解释了快速排序的原理,可参考 阅读原文

function quickSort($arr){

	$len = count($arr);
	if($len<=1){
		return $arr;
	}
	$left = array();
	$right = array();
	$base_num = $arr[0];
	for($i=1;$i<$len;$i++){
		if($base_num>$arr[$i]){
			$left[] = $arr[$i];
		}else{
			$right[] = $arr[$i];
		}
	
	}
        $left = quickSort($left);
	$right = quickSort($right);
	return array_merge($left,array($base_num),$right);
}

四、选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。来源于百度百科。
/**
 * 选择排序(一维数组)
 * 1首先在未排序序列中找到最小元素,存放到排序序列的起始位置,
 * 2,然后再从剩余未排序元素中继续寻找最小元素,放到排序序列末尾。
 * 3,以此类推,直到所有元素均排序完毕。
 */
function select_sort($arr)
{
    $len = count ($arr);
    for ($i = 0; $i < $len - 1; $i++) {
        $k = $i;
        for ($j = $i + 1; $j < $len; $j++) {
            if ($arr[$k] > $arr[$j]) {
                $k = $j;
            }
        }
        if ($k != $i) {
            $tmp = $arr[$i];
            $arr[$i] = $arr[$k];
            $arr[$k] = $tmp;
        }
    }
    return $arr;
}
关于这几种排序的效率问题,可以参考这篇博文: 点击打开链接



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值