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

排序算法总结 实现 Demo (Java)

  • 2016年05月19日 17:53
  • 102KB
  • 下载

PHP 实现四种基本排序算法

许多人都说算法是程序的核心,算法的好坏决定了程序的质量。作为一个初级phper,虽然很少接触到算法方面的东西。但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具。前提:分别用冒泡排序法,快速...
  • fuckomg
  • fuckomg
  • 2017年04月02日 11:10
  • 521

四种排序算法PHP实现类

四种排序算法的PHP实现: 1) 插入排序(Insertion Sort)的基本思想是:  每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止...

PHP实现四种基本排序算法

前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。  $arr(1,43,54,62,21,66,32,78,36,76,39);   1...

PHP_实现四种基本排序算法

摘要: PHP 实现四种基本排序算法 许多人都说算法是程序的核心,算法的好坏决定了程序的质量。作为一个初级phper,虽然很少接触到算法方面的东西。但是对于基本的排序算法还是应该掌握的,它是程序开发的...

PHP实现快速排序算法

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

PHP实现四种基本排序算法

1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,...

PHP 四种基本排序算法的代码实现

1. 冒泡排序 $arr=array(1,43,54,62,21,66,32,78,36,76,39); function bubbleSort($arr) { $len=count($ar...

全面实现PHP排序算法

一般排序算法 1.插入排序(一维数组) 原理: 首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。 从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP实现排序算法总结
举报原因:
原因补充:

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