PHP 排序算法实现讲解

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序 算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符 合实际的优秀算法,得经过大量的推理和分析。

分别使用插入排序法,冒泡排序法,选择排序法,快速排序法,将下面数组中的值进行按照从小到大的顺序进行排序操作。

$arr(12,43,57,32,51,76,36,91,28,46,40);

1、插入排序法

分析:既定前面数字已经排好顺序,现在要把第n个数字插入到前面有序的数组中,使得这n个数字也是有序的放入其中,如此反复循环直至全部排好顺序。

具体代码实现如下:

$arr(12,43,57,32,51,76,36,91,28,46,40);
function insertSort($arr) {
    $len=count($arr); 
    for($i=1, $i<$len; $i++) {
        $tmp = $arr[$i];
        for($j=$i-1;$j>=0;$j--) {
            if($tmp < $arr[$j]) {
                //比较大小当数字小时交换位置,将后面的数字与前面的数字进行互换操作
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                //不需要,直接跳过
                break;
            }
        }
    }
    return $arr;
}

2、冒泡排序法

分析:从前往后对相邻的两个数字依次进行比较调整,让较大的数字往下沉,让较小的数字往上升,即每相邻的数字进行对比排序,顺序不符合时将其调换位置。

具体代码实现如下:

$arr(12,43,57,32,51,76,36,91,28,46,40);
function bubbleSort($arr)
{  
  $len=count($arr);
  for($i=1;$i<$len;$i++)
  { //循环比较次数
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}

3、选择排序法

分析:选出最小的一个数字与第一个位置数字交换,之后再剩余的数当中再次找到最小的数字与第二个位置交换,依此循环到倒数第二个数字和最后一个数字比较结束为止。

具体代码实现如下:

$arr(12,43,57,32,51,76,36,91,28,46,40);
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;
}

4、快速排序法

分析:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

具体代码实现如下:

$arr(12,43,57,32,51,76,36,91,28,46,40);
function quickSort($arr) {
    //判断是否继续进行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //选择第一个数字作为基准
    $base_num = $arr[0];
    //遍历除了基准外的所有数字,按照大小关系放入两个数组内,之后初始化两个数组
    $left_array = array();  //小于基准
    $right_array = array();  //大于基准
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右边数组
            $right_array[] = $arr[$i];
        }
    }
    //分别对两数组进行相同的排序处理方式递归
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合并数组
    return array_merge($left_array, array($base_num), $right_array);
}

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2015-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PPV课数据科学社区

【学习】视觉直观感受 7 种常用排序算法

10月14日发布《统计世界的十大算法》后,很多朋友在后台询问,哪里有“视觉直观感受 7 种常用排序算法”,今天分享给大家,感谢todayx.org。 1. 快速...

32550
来自专栏Android知识点总结

再见kotlin--02函数

8720
来自专栏林德熙的博客

不使用数据结构反转栈

昨天有人问我一道题,我有一个栈,我不使用其他数据结构,不使用另一个栈,把这个栈里所有数据反转。

8010
来自专栏IT杂记

求一个数组中子数组的最大和算法(Java实现)

    前几天在微信订阅号“待字闺中”中看到的一篇文章《小技巧求一个数组中子数组的最大和》,提供下Java的实现,并且在对题目做下小修改,本来打算直接在微信里直...

35880
来自专栏Python爬虫与算法进阶

学点算法之字符串的乱序检查

问题 字符串的乱序检查。 一个字符串是另一个字符串的乱序。如果第二个字符串只是第一个的重新排列,例如,’heart’ 和 ‘earth’ 就是乱序字符串。’py...

41580
来自专栏大数据文摘

视觉直观感受 7 种常用排序算法

20850
来自专栏软件开发 -- 分享 互助 成长

C++ STL之vector容器的基本操作

注意事项: 特别注意任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子) 特别注意begin()指向的是vec中的第0个元素,而e...

27170
来自专栏机器学习算法与Python学习

动画+原理+代码,解读十大经典排序算法

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见...

16730
来自专栏ACM算法日常

How many integers can you find(容斥原理) - HDU 1796

看这题之前先复习一下容斥原理,不然肯定看不懂,呃,如果第一次接触容斥原理的题,可能弄懂了容斥原理你还是看不懂代码,是的,等会你就知道了。

9520
来自专栏Java 源码分析

优先队列

优先队列基本介绍 ​ 优先队列又叫做堆,他是一种比较特殊的完全二叉树。所谓完全二叉树就是一层层的堆叠,本层不满就不能堆放下一层。并且优先队列还有一个特点就...

29140

扫码关注云+社区

领取腾讯云代金券