常用的几个排序算法

 程序 = 数据结构 算法,算法是程序的灵魂,有些网站能够在高并发、大数据的情况下依旧坚挺。我们可能会说,那是因为运用了服务器集群,数据库读写分离,缓存技术等等。但是这些优化技术是如何实现的呢?这就要问问哪些高明的算法工程师了。所以对于WEB开发而言,虽然用到算法的地方不多,但是了解一些常用的算法还是很有必要的,这样才能看懂一些“高明”的程序设计技巧。

 下面,是一些常用的排序算法,包括冒泡排序,选择排序,快速排序和插入排序。我会通过一些示例,对一个一维数组进行从小到大排序。

 

冒泡排序

<?php 
//冒泡排序
//冒泡排序因排序过程形似冒泡而得名。
$arr = [5,5,2,3,1,6,8,4];
function maopao($arr) 
{
    $len = count($arr);
    for ($i=0; $i<$len-1; $i++) { //实际只循环了$len-1次
        for ($j=$len-1; $j>$i; $j--) {
            if ($arr[$j]<$arr[$j-1]) {
                $swap = $arr[$j];
                $arr[$j] = $arr[$j-1];
                $arr[$j-1] = $swap;
            }
        }
    }
    var_export($arr);
}

maopao($arr);
echo "<hr/>";


选择排序

//选择排序
//思路十分简单的一种排序方式,从头开始,逐次和后面的值相比较。
function xuanze($arr) 
{
    $len = count($arr);
    for ($i=0; $i<$len; $i++) {
        for ($j=$i+1; $j<$len; $j++) {
            if ($arr[$j]<$arr[$i]) {
                $swap = $arr[$j];
                $arr[$j] = $arr[$i];
                $arr[$i] = $swap;
            }
        }
    }
    var_export($arr);
}

xuanze($arr);
echo "<hr/>";


 优化选择排序

//选择排序和冒泡排序都进行了大量的交换,其实仔细思考就会发现,这些交换并不一定都是必要的。
//那么我是不是可以在每组比较的过程中,不进行交换,只是记录key值,在比较的最后,再进行交换。下面对选择排序进行优化
function xuanze2($arr)
{
    $len = count($arr);
    for ($i=0; $i<$len; $i++) {
        $t = $i;
        for ($j=$i+1; $j<$len; $j++) {
            if ($arr[$t]>$arr[$j]) {
                $t = $j;
            }
        }
        if ($t != $i) {
            $swap = $arr[$t];
            $arr[$t] = $arr[$i];
            $arr[$i] = $swap;
        }
    }
    var_export($arr);
}

xuanze2($arr);
echo "<hr/>";


快速排序

//和它的名字一样,快排是速度非常快的一种排序。排序思路就是运用递归。
//第一次,在数组中选定一个中间数,讲比它小的放在左边;比它大的放在右边。
//第二次,将第一次分好的堆,继续重复第一次的规则......
function kuaipai($arr) {
    @$t = $arr[0];
    $len = count($arr);
    if ($len<=1) {
        return $arr;
    } 
    $arr1 = [];
    $arr2 = [];
    for ($i=1; $i<$len; $i++) {
        if ($arr[$i]<=$t) {
            $arr1[] = $arr[$i];
        } else {
            $arr2[] = $arr[$i];
        }
    }
    return array_merge(kuaipai($arr1), array($t), kuaipai($arr2));
}
 
$arr = kuaipai($arr);
var_export($arr);
echo "<hr/>";


插入排序

//第一个元素被认为是已排序元素.
//未排序元素从已排序元素中从前往后进行比较
//若已排序元素大于等于未排序元素,则将已排序元素向后移一位。
function charu($arr)
{
    $len = count($arr);
    for ($i=1; $i<$len; $i++) {
        $j = $i-1;
        $tmp = $arr[$i];
        while($j>=0&&$arr[$j]>$tmp){
            $arr[$j+1] = $arr[$j];
            $arr[$j] = $tmp;
            $j--;
        }
    }
    var_export($arr);
}
 
charu($arr);
echo "<hr/>";

 算法,是一门需要仔细琢磨的程序设计的“艺术”,我想作为web开发程序员,不应该对其怀有“抵制”心态,而是坦然的接受,学习,思考,并加以总结。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值