关闭

PHP实现排序算法总结

标签: 排序算法
209人阅读 评论(0) 收藏 举报
分类:

1、冒泡排序

原理:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
时间复杂度:该算法的时间复杂度为O(n2)。但是,当原始关键字序列已有序时,只进行一趟比较就结束,此时时间复杂度为O(n)。

function bubbleSort($array) {
    // 不是数组或者空数组,直接返回
    if (!is_array($array) || count($array) == 0)
        return $array;

    $count = count($array);
    $flag = false;

    if ($count <= 0) 
        return false;
    for ($i = 0; $i < $count; $i++) { 
        for ($j = $count - 1; $j > $i; $j--) { 
            if ($array[$j] < $array[$j - 1]) {
                $tmp = $array[$j];
                $array[$j] = $array[$j - 1];
                $array[$j - 1] = $tmp;
                $flag = true;
            }
        }
        // 如果为正序排列,则直接返回该数组
        if (!$flag) 
            break;
        $flag = false;
    }
    return $array;
}

上述代码设置$flag 目的是优化排序,比如说这种情况下排序 [2,1,3,4,5,6] 如果有序只需要循环n-1次即可结束。

2、选择排序

原理:每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
时间复杂度:时间复杂度为o(n2),不稳定排序,适合规模比较小的

function selectSort($arr) {
//双重循环完成,外层控制轮数,内层控制比较次数
 $len=count($arr);
    for($i=0; $i<$len-1; $i++) {
        //先假设最小的值的位置
        $p = $i;

        for($j=$i+1; $j<$len; $j++) {
            //$arr[$p] 是当前已知的最小值
            if($arr[$p] > $arr[$j]) {
            //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
                $p = $j;
            }
        }
        //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最终结果
    return $arr;
}

3、插入排序

原理:每次将一个待排序的数据元素插入到前面已经排好序的数列中,使数列依然有序,知道待排序数据元素全部插入完为止。
时间复杂度:如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。

function insertSort($arr) {
    if (!is_array($arr) || count($arr) == 0) 
        return $arr;
    $count = count($arr);
    for ($i = 1; $i < $count; $i++) { 
        // 获取第二个元素的值
        $tmp = $arr[$i];
        // 获取前面的值的下标
        $j = $i - 1;
        // 如果前面的值比后面的值大,这里是从小到大
        while ($arr[$j] > $tmp) {
            // 把小的元素和前面的对换,直到移动到合适的位置,在移动下一个
            $arr[$j + 1] = $arr[$j];
            $arr[$j] = $tmp;
            if ($j > 0)
                $j--;
        }
    }
    return $arr;
}

4、快速排序
原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
时间复杂度:快速排序主体算法时间运算量约 O(log2n) ,划分子区函数运算量约 O(n) ,所以总的时间复杂度为 O(nlog2n) ,它显然优于冒泡排序 O(n2). 可是算法的优势并不是绝对的。试分析,当原文件关键字有序时,快速排序时间复杂度是 O(n2), 这种情况下快速排序不快。而这种情况的冒泡排序是 O(n), 反而很快。在原文件记录关键字无序时的多种排序方法中,快速排序被认为是最好的一种排序方法。

function quickSort($arr) {
    if (!is_array($arr) || count($arr) == 0) 
        return $arr;
    $count = count($arr);
    $key = $arr[0];
    $left_arr = array();
    $right_arr = array();
    for ($i = 1; $i < $count; $i++) { 
        if ($arr[$i] <= $key)
            $left_arr[] = $arr[$i];
        else
            $right_arr[] = $arr[$i];
    }
    $left_arr = quickSort($left_arr);
    $right_arr = quickSort($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:148247次
    • 积分:2431
    • 等级:
    • 排名:第15235名
    • 原创:107篇
    • 转载:38篇
    • 译文:0篇
    • 评论:11条
    最新评论