PHP实现常见排序算法的示例代码

 更新时间:2022年06月06日 16:52:07   作者:PHP开源社区  
这篇文章主要介绍了PHP实现常见排序算法(冒泡排序、选择排序、快速排序和插入排序)的示例代码,感兴趣的小伙伴可以跟随小编一起学习一下

1、冒泡排序

两两相比,每循环一轮就不用再比较最后一个元素了,因为最后一个元素已经是最大或者最小。

function maopaoSort ($list)
{
    $len = count($list);
    for ($i = 0; $i < $len - 1; $i++) {
        for ($j = 0; $j < $len - $i - 1; $j++) {
            if ($list[$j] > $list[$j + 1]) {
                $tmp = $list[$j];
                $list[$j] = $list[$j + 1];
                $list[$j + 1] = $tmp;
            }
        }
    }
    return $list;
}

2、选择排序

选定一个作为基本值,剩下的和这个比较,然后调换位置。

function xuanzeSort ($list)
{
    $len = count($list);
    for ($i = 0; $i < $len - 1; $i++) {
        $pos = $i;
        for ($j = $i + 1; $j < $len; $j++) {
            if ($list[$pos] > $list[$j]) {
                $pos = $j;
            }
        }
        if ($pos != $i) {
            $tmp = $list[$pos];
            $list[$pos] = $list[$i];
            $list[$i] = $tmp;
        }
    }
    return $list;
}

3、快速排序

原理就是拿出一个标尺值,然后分为左右两个数组,分别对比

function kuaisuSort ($list)
{
    $len = count($list);
    if ($len <= 1) {//递归出口
        return $list;
    }
    $base = $list[0];//选择一个比较值
    $leftList = $rightList = [];
    for ($i = 1; $i < $len; $i++) {
        if ($base > $list[$i]) {
            $leftList[] = $list[$i];
        } else {
            $rightList[] = $list[$i];
        }
    }
    //递归分别再处理左右两边的数组
    $leftList = kuaisuSort($leftList);
    $rightList = kuaisuSort($rightList);
    return array_merge($leftList, [$base], $rightList);
}

4、插入排序

假设前面的数都是排好顺序的,要把第n个数插入到有序里

function charuSort ($list)
{
    $len = count($list);
    for ($i = 1; $i < $len; $i++) {
        $tmp = $list[$i];//获取对比元素
        for ($j = $i - 1; $j > 0; $j--) {
            if ($list[$j] > $tmp) {
                $list[$j + 1] = $list[$j];
                $list[$j] = $tmp;
            } else {
                break;
            }
        }
    }
    return $list;
}

补充

当然PHP还能实现其他的常见排序算法,如归并排序、希尔排序、堆排序等

归并排序

/**
 * 归并排序
 *
 * @param array $lists
 * @return array
 */
 function merge_sort(array $lists)
 {
 $n = count($lists);
 if ($n <= 1) {
 return $lists;
 }
 $left = merge_sort(array_slice($lists, 0, floor($n / 2)));
 $right = merge_sort(array_slice($lists, floor($n / 2)));
 $lists = merge($left, $right);
 return $lists;
 } 
function merge(array $left, array $right)
 {
 $lists = [];
 $i = $j = 0;
 while ($i < count($left) && $j < count($right)) {
 if ($left[$i] < $right[$j]) {
 $lists[] = $left[$i];
 $i++;
 } else {
 $lists[] = $right[$j];
 $j++;
 }
 }
 $lists = array_merge($lists, array_slice($left, $i));
 $lists = array_merge($lists, array_slice($right, $j));
 return $lists;
 }

希尔排序

/**
 * 希尔排序 标准
 *
 * @param array $lists
 * @return array
 */
 function shell_sort(array $lists)
 {
 $n = count($lists);
 $step = 2;
 $gap = intval($n / $step);
 while ($gap > 0) {
 for ($gi = 0; $gi < $gap; $gi++) {
 for ($i = $gi; $i < $n; $i += $gap) {
 $key = $lists[$i];
 for ($j = $i - $gap; $j >= 0 && $lists[$j] > $key; $j -= $gap) {
 $lists[$j + $gap] = $lists[$j];
 $lists[$j] = $key;
 }
 }
 }
 $gap = intval($gap / $step);
 }
 return $lists;
 }

堆排序

/**
 * 堆排序
 *
 * @param array $lists
 * @return array
 */
 function heap_sort(array $lists)
 {
 $n = count($lists);
 build_heap($lists);
 while (--$n) {
 $val = $lists[0];
 $lists[0] = $lists[$n];
 $lists[$n] = $val;
 heap_adjust($lists, 0, $n);
 //echo "sort: " . $n . "\t" . implode(', ', $lists) . PHP_EOL;
 }
 return $lists;
 } 
function build_heap(array &$lists)
 {
 $n = count($lists) - 1;
 for ($i = floor(($n - 1) / 2); $i >= 0; $i--) {
 heap_adjust($lists, $i, $n + 1);
 //echo "build: " . $i . "\t" . implode(', ', $lists) . PHP_EOL;
 }
 //echo "build ok: " . implode(', ', $lists) . PHP_EOL;
 }

 function heap_adjust(array &$lists, $i, $num)
 {
 if ($i > $num / 2) {
 return;
 }
 $key = $i;
 $leftChild = $i * 2 + 1;
 $rightChild = $i * 2 + 2;
 
 if ($leftChild < $num && $lists[$leftChild] > $lists[$key]) {
 $key = $leftChild;
 }
 if ($rightChild < $num && $lists[$rightChild] > $lists[$key]) {
 $key = $rightChild;
 }
 if ($key != $i) {
 $val = $lists[$i];
 $lists[$i] = $lists[$key];
 $lists[$key] = $val;
 heap_adjust($lists, $key, $num);
 }
 }

到此这篇关于PHP实现常见排序算法的示例代码的文章就介绍到这了,更多相关PHP排序算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP中防止SQL注入攻击和XSS攻击的两个简单方法

    PHP中防止SQL注入攻击和XSS攻击的两个简单方法

    所有有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss,注意中文要写出htmlentities
    2010-04-04
  • PHP session_start()问题解疑(详细介绍)

    PHP session_start()问题解疑(详细介绍)

    对于PHP的session功能,始终找不到合适的答案,尤其是一些错误,还有一些没有错误的结果,最可怕的就是后者,一直为许多的初学者为难。就连有些老手,有时都被搞得莫名其妙
    2013-07-07
  • php连接oracle数据库的核心步骤

    php连接oracle数据库的核心步骤

    这篇文章主要介绍了php连接oracle数据库的核心步骤,简要分析了php安装Oracle扩展设置及连接测试代码,非常简单易懂,需要的朋友可以参考下
    2016-05-05
  • 深入理解PHP中mt_rand()随机数的安全

    深入理解PHP中mt_rand()随机数的安全

    mt_rand()使用mersennetwister算法返回随机整数,这个大家都知道,但下面这篇文章主要给大家介绍的是关于PHP中mt_rand()随机数安全的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-10-10
  • php读取mssql的ntext字段返回值为空的解决方法

    php读取mssql的ntext字段返回值为空的解决方法

    这篇文章主要介绍了php读取mssql的ntext字段返回值为空的解决方法,可通过修改字段类型或采用adodb组件来解决,具有一定参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • php实现redis数据库指定库号迁移的方法

    php实现redis数据库指定库号迁移的方法

    这篇文章主要介绍了php实现redis数据库指定库号迁移的方法,涉及对于redis数据库的操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-01-01
  • PHP中常用数组处理方法实例分析

    PHP中常用数组处理方法实例分析

    把php中常用的几种处理数组的方法都整理了下,方便了大家学习,大家可以逐个去运行下,熟悉php数组的使用
    2008-08-08
  • php中计算时间差的几种方法

    php中计算时间差的几种方法

    在php中计算时间差有时候是件麻烦的事!不过只要你掌握了日期时间函数的用法那这些也就变的简单了
    2009-12-12
  • 用php代码限制国内IP访问我们网站

    用php代码限制国内IP访问我们网站

    这篇文章主要介绍了用php代码限制国内IP访问我们网站,需要的朋友可以参考下
    2015-09-09
  • PHP多线程之内部多线程实例分析

    PHP多线程之内部多线程实例分析

    这篇文章主要介绍了PHP多线程之内部多线程,实例分析了php多线程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论