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

 更新时间:2022-07-25 10:31:59   作者:佚名   我要评论(0)

目录1、冒泡排序2、选择排序3、快速排序4、插入排序补充1、冒泡排序
两两相比,每循环一轮就不用再比较最后一个元素了,因为最后一个元素已经

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实现常用排序算法的方法
  • PHP快速排序算法实例分析
  • php排序算法实例分析
  • PHP四种基本排序算法示例

相关文章

  • PHP一文带你搞懂游戏中的抽奖算法

    PHP一文带你搞懂游戏中的抽奖算法

    目录前言一、初始化奖品二、谢谢参与三、过滤抽奖、如充值条件四、重组概率五、进行抽奖六、过滤回调七、最终抽奖结果八、抽奖封装成类前言
    2022-07-25
  • PHP实现常见排序算法的示例代码

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

    目录1、冒泡排序2、选择排序3、快速排序4、插入排序补充1、冒泡排序 两两相比,每循环一轮就不用再比较最后一个元素了,因为最后一个元素已经
    2022-07-25
  • 利用PHP?POST临时文件机制实现任意文件上传的方法详解

    利用PHP?POST临时文件机制实现任意文件上传的方法详解

    目录原理如何获取临时文件名$_FILESphpinfoglob如何利用该文件组合请求延长临时文件存在时间参考原理 向 PHP 发送 Post 数据包,如果数据包中
    2022-07-25
  • PHP中数组处理函数的使用方法详解

    PHP中数组处理函数的使用方法详解

    目录一、键、值操作函数二、数组元素个数有关的函数三、使用回调函数处理数组的函数四、数组的排序函数五、拆分,合并,分解,结合数组六、获
    2022-07-25
  • 基于PHP实现邮件实时通知功能

    基于PHP实现邮件实时通知功能

    目录一、安装环境二、下载 三、 邮箱设置四、php发送邮件五、php框架中使用一、安装环境 PHPMailer 需要 PHP 的 sockets 扩展支持 另外登录
    2022-07-25
  • 基于PHP实现原生增删改查的示例代码

    基于PHP实现原生增删改查的示例代码

    目录一、代码1、sql2、列表页(index.php)3、delete.php4、update.php5、create.php二、效果图一、代码 1、sql -- phpMyAdmin SQL Dump -- ve
    2022-07-25
  • PHP利用雪花(SnowFlake)算法生成唯一ID

    PHP利用雪花(SnowFlake)算法生成唯一ID

    目录一、雪花算法原理解析1. 分布式ID常见生成策略2. 雪花算法的结构二、PHP源码实现案例1.demo12.demo2这个算法的好处很简单可以在每秒产生
    2022-07-25
  • PHP平滑关闭/重启的实现方法

    PHP平滑关闭/重启的实现方法

    目录前言原理阻塞信号处理信号拼起来思考前言 写过 CLI 常驻进程的老司机肯定遇到过这么一个问题:在需要更新程序的时候,我要怎样才能安全关
    2022-07-25
  • PHP中时间处理类Carbon的用法详解

    PHP中时间处理类Carbon的用法详解

    目录1.Introduction2.Instantiation3.Localization4.Testing Aids()5.Getters6.Setters7.Fluent Setters8.IsSet1.Introduction Carbon 是php
    2022-07-25
  • PHP实战之投票系统的实现

    PHP实战之投票系统的实现

    目录一、实现代码1.sql2.html3.admin.php(增删改查投票的页面)密码:admi4.index.php投票的页面二、效果图一、实现代码 1.sql -- phpMyAd
    2022-07-25

最新评论