PHP实现排序算法总结

原创 2016年05月31日 15:36:35

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);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

用php实现的各种排序算法总结

用PHP实现的各种排序算法,冒泡排序,交换排序,选择法排序,插入法排序,快速排序,根据实际情况可选择不同的排序算法。效率也有所不同。 重要的还是先理解了算法,实现起来才水到渠成。冒泡排序:<?php...

PHP 排序算法的实现

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个...

经典排序算法的PHP实现类

近期广受笔试摧残,对于各种排序也是晕头转向。 更坑爹的是貌似大多都是用C++、Java实现相关算法,让我搞PHP的情何以堪,更何况,PHP本身就有排序函数sort(),其实来说,是很简单的,这也可能...

php实现4种排序算法

PHP实现编程中4个基本的排序算法:冒泡排序、选择排序、插入排序、快速排序

桶排序算法实现-PHP

简单意义上的桶排序: 桶排序的原理是先安排N+1个桶作为容器,若数据范围为N的话。 然后将测试数据(所需排序的数据)进行循环,放入对应的桶内。数据一定是在范围N内的。 最后,循环桶里的元素,并且输出,...

PHP实现快速排序算法

快速排序(Quick Sort)是对冒泡排序的一种改进,属不稳定排序算法,由东尼·霍尔在1962年提出。快速排序基本步骤:从数列中挑出一个元素(一般称为称为“基准”),通过一趟排序将要排序的数据分割成...
  • zqtsx
  • zqtsx
  • 2013-06-27 16:20
  • 1307

PHP实现四种基本排序算法

1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)