PHP中常用数组排序算法

news2024/12/24 2:45:58

一:冒泡排序

1:算法步骤

  • 比较相邻项的值,如果前者比后者大,交换顺序。

  • 进行一轮比较后,最后一个值为最大的值。

  • 进行下一轮比较,比上次少比较一项。

  • 以此类推,比较剩下最后一项的时候,比较结束。

2:动态演示

 

3:示例代码

/**
 * 冒泡排序
 */
public function bubbleSort($arr)
{
    $temp = 0;
    //外层循环,只要确定排好n-1个数,则最后一个数自然排好了
    for($i=0;$i<count($arr)-1;$i++){
        //每次进行一次大循环时,最大数已经在最后了,则下次循环则不用再比较已经排好的数
        for($j=0;$j<count($arr)-1-$i;$j++){
            if($arr[$j] > $arr[$j+1]){
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}

二:选择排序

1:算法步骤

  • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

  • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

  • 重复第二步,直到所有元素均排序完毕。

2:动态演示

 

3:示例代码

/**
 * 选择排序
 */
public function selectionSort($arr)
{
    $temp=0;
    for($i=0;$i<count($arr)-1;$i++){
        $minVal = $arr[$i]; //假设$i就是最小值
        $minIndex = $i; //记录认为最小值的小标
        for($j=$i+1;$j<count($arr);$j++){
            if($minVal > $arr[$j]){
                $minVal = $arr[$j];
                $minIndex = $j;
            }
        }
        $temp = $arr[$i];
        $arr[$i] = $arr[$minIndex];
        $arr[$minIndex] = $temp;
    }
    return $arr;
}

三:插入排序

1:算法步骤

  • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面)。

2:动态演示

 

3:示例代码

/**
 * 插入排序
 */
public function insertionSort($arr)
{
    for($i=1;$i<count($arr);$i++){
        //insertVal是准备插入的数
        $insertVal = $arr[$i];
        //准备先和insertIndex比较
        $insertIndex = $i-1;
        while($insertIndex>=0 && $insertVal<$arr[$insertIndex]){
            //把较大的数后移
            $arr[$insertIndex+1] = $arr[$insertIndex];
            $insertIndex--;
        }
        //插入(这时为$indexVal找到适当的位置了)
        $arr[$insertIndex+1] = $insertVal;
    }
    return $arr;
}

四:归并排序

1:算法步骤

  • 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。

  • 设定两个指针,最初位置分别为两个已经排序序列的起始位置。

  • 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。

  • 重复步骤 3 直到某一指针达到序列尾。

  • 将另一序列剩下的所有元素直接复制到合并序列尾。

2:动态演示

 

3:示例代码

/**
 * 归并排序
 */
public function mergeSort($arr)
{
    $len = count($arr);
    //数组就只有一个元素时,直接返回
    if ($len <= 1) {
        return $arr;
    }
    $mid = intval($len / 2); // 取数组中间
    $left = array_slice($arr, 0, $mid); //数组拆分,以0下标开始,长度为$mid拆分
    $right = array_slice($arr, $mid); // 数组拆分,以$mid下标开始到数组结尾拆分
    $left = $this->mergeSort($left); // 左边拆分完后开始递归合并往上走
    $right = $this->mergeSort($right); // 右边拆分完毕开始递归往上走
    $arr = $this->merge($left, $right);
    return $arr;
}

/**
 * 将指定的两个有序数组(arrA, arr)合并并且排序
 */
public function merge($arrA, $arrB)
{
    $arrC = array();
    while (count($arrA) && count($arrB)) {
        // 这里不断的判断哪个值小, 就将小的值给到arrC, 但是到最后肯定要剩下几个值,
        // 不是剩下arrA里面的就是剩下arrB里面的而且这几个有序的值, 肯定比arrC里面所有的值都大所以使用
        $arrC[] = $arrA[0] < $arrB[0] ? array_shift($arrA) : array_shift($arrB);//array_shift():删除数组中第一个元素,并返回被删除元素的值
    }
    return array_merge($arrC, $arrA, $arrB);
}

五:快速排序

1:算法步骤

  • 从数列中挑出一个元素,称为 “基准”(pivot)。

  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

2:动态演示

 

3:示例代码

/**
 * 快速排序
 */
public function quickSort($arr)
{
//判断传入的数组是否只有一个,只有一个不需要进行排序,直接返回
    if (count($arr) <= 1) {
        return $arr;
    }
    $middle = $arr[0]; // 设置中间值
    $left = array(); // 接收小于中间值
    $right = array();// 接收大于中间值
    // 循环比较
    for ($i=1; $i < count($arr); $i++) {
        if ($middle < $arr[$i]) {
            // 大于中间值
            $right[] = $arr[$i];
        } else {
            // 小于中间值
            $left[] = $arr[$i];
        }
    }
    // 递归排序划分好的2边
    $left = $this->quickSort($left);
    $right = $this->quickSort($right);
    // 合并排序后的数据
    return array_merge($left, array($middle), $right);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Hive】group by 分组聚合后使用窗口函数

文章目录 1. group by 分组聚合后使用排序窗口函数1.1 两种思路 与 简单例子1.2 新思路的解释 2. group by 分组聚合后使用聚合窗口函数3. group by 分组聚合后使用分析窗口函数 1. group by 分组聚合后使用排序窗口函数 1.1 两种思路 与 简单例子 group by 之后&#xff0c;…

AI时代带来的图片造假危机,该如何解决

一、前言 当今&#xff0c;图片造假问题非常泛滥&#xff0c;已经成为现代社会中一个严峻的问题。随着AI技术不断的发展&#xff0c;人们可以轻松地通过图像编辑和AI智能生成来篡改和伪造图片&#xff0c;使其看起来真实而难以辨别&#xff0c;之前就看到过一对硕士夫妻为了骗…

【Linux】进程信号 -- 信号保存与递达 | 信号捕捉 | 僵尸进程的信号处理方法

阻塞信号信号相关概念内核中的表示sigset_t信号集操作函数sigprocmasksigpending 小实验 - 观察pending表 信号的捕捉流程sigaction1.小实验&#xff1a;如果进程在处理2号信号&#xff0c;那我们继续发送2号信号会怎么样&#xff1f;2.如何正在处理这个信号&#xff0c;同时屏…

js - 关于防抖和节流函数的使用和细节

文章目录 一、什么是防抖二、应用场景三、实现原理1&#xff0c;第一个问题&#xff1a;为什么使用了闭包&#xff08;也就是说timer为什么定义到了外面&#xff09;2&#xff0c;第二个问题&#xff1a;防抖函数中this的指向问题&#xff1a; 四、节流函数 一、什么是防抖 事…

【【51单片机的I2C总线】】

51单片机的I2C总线 学会总线&#xff0c;掌控芯片。了解串口&#xff0c;真理全有。 I&#xff12;C时序 &#xff11;.起始条件&#xff1a;  SCL在高电平期间&#xff0c;SDA从高电平切换到低电平 终止条件&#xff1a; SCL在高电平期间&#xff0c;SDA从低电平切换为高电…

【go语言学习笔记】01 Go语言快速入门

文章目录 一、基础入门1. 示例程序2. 安装与环境变量设置3. 项目构建和编译发布3.1 go build和go install对比3.2 跨平台编译 二、数据类型1. 基础类型1.1 整型1.2 浮点数1.3 布尔型1.4 字符串1.5 零值 2. 变量2.1 变量声明2.1.1 指定变量类型2.1.2 根据值自行判定变量类型2.1.…

深入学习 Redis - 深挖经典数据类型之 list

目录 前言 一、list 类型 1.1、操作命令 lpush / rpush&#xff08;插入元素&#xff09; lrange&#xff08;查看范围元素&#xff09; lpushx / rpushx &#xff08;有约束的插入&#xff09; lpop / rpop&#xff08;头删尾删&#xff09; lindex&#xff08;获取下…

2023年第三届能源、电力与电气工程国际会议 (CoEEPE 2023)

会议简介 Brief Introduction 2023年第三届能源、电力与电气工程国际会议(CoEEPE 2023) 会议时间&#xff1a;2023年11月22日-24日 召开地点&#xff1a;澳大利亚墨尔本 大会官网&#xff1a;www.coeepe.org 2023年第三届能源、电力与电气工程国际会议(CoEEPE 2023)由安徽大学、…

使用GGML和LangChain在CPU上运行量化的llama2

Meta AI 在本周二发布了最新一代开源大模型 Llama 2。对比于今年 2 月发布的 Llama 1&#xff0c;训练所用的 token 翻了一倍&#xff0c;已经达到了 2 万亿&#xff0c;对于使用大模型最重要的上下文长度限制&#xff0c;Llama 2 也翻了一倍。 在本文&#xff0c;我们将紧跟趋…

JavaScript基础语法及小案例

目录 JavaScript基础语法1. 变量声明和赋值2. 数据类型1) 基本数据类型2) 复合数据类型(引用类型)3) 特殊数据类型 3. 运算符1) 算术运算符2) 赋值运算符3) 比较运算符4) 逻辑运算符5) 三元运算符 4. 控制流程1) 条件语句2) 循环语句 5. 函数1) 函数的基本使用① 什么是函数② …

DXFReader.NET 2023 Crack

DXFReader.NET 是一个 .NET 组件&#xff0c;允许直接从 AutoCAD 图形文件格式 DXF&#xff08;也称为图形交换格式&#xff09;查看、操作和打印。 DXFReader.NET 之 DXF 是 Drawing eXchange Format 的首字母缩写。DXF 是图形文件内容的复制&#xff0c;支持将文件从一个 CA…

机器学习深度学习——预备知识(上)

深大的夏令营已经结束&#xff0c;筛选入营的保研er就筛选了1/3&#xff0c;280多的入营总人数里面双非只有30左右。 最终虽然凭借机试拿到offer了&#xff0c;但是我感受到了自己的明显短板&#xff0c;比如夏令营的舍友就都有一篇核心论文&#xff0c;甚至还有SCI一区一作的。…

Mac应用程序因“来自身份不明的开发者”无法打开如何解决

相信不少mac电脑用户在安装应用程序时经常会遇到“xxx.app已损坏&#xff0c;打不开。这是mac系统的新的安全机制&#xff0c;安装 App 时提示&#xff1a; 常见的几种报错提示 xxx 已损坏&#xff0c;无法打开。您应该将它移到废纸篓打不开 xxx&#xff0c;因为它来自身份不明…

旋翼式水表安装注意事项

旋翼式水表是一种常用的水流计量设备&#xff0c;适用于小口径管道的单向水流总量的计量。如果你正在考虑安装旋翼式水表&#xff0c;以下是一些需要注意的事项&#xff1a; 1.安装位置的选择&#xff1a;旋翼式水表应该安装在管道的垂直方向上&#xff0c;并且水流方向必须与水…

探秘ArrayList源码:Java动态数组的背后实现

探秘ArrayList源码&#xff1a;Java动态数组的背后实现 一、成员变量二、构造器1、默认构造器2、带初始容量参数构造器3、指定collection元素参数构造器 三、add()方法扩容机制四、场景分析1、对于ensureExplicitCapacity&#xff08;&#xff09;方法1.1 add 进第 1 个元素到 …

MQTT的理解和使用

MQTT是一种基于发布/订阅模式的轻量协议&#xff0c;该协议基于TCP/IP协议上&#xff0c;由IBM在1999年发布。 流程理解&#xff1a;订阅者在订阅时会选择主题&#xff08;Topic&#xff09;和服务质量&#xff08;QoS&#xff09;&#xff0c;然后发布者发布消息&#xff0c…

matlab超前-滞后校正

1控制系统的校正 系统性能 稳定性、准确性、快速性 动态性能-超前校正 阶跃曲线、频域&#xff08;bode图&#xff09;、根轨迹&#xff08;增加零点-根轨迹左移稳定性提高&#xff09;、PID控制&#xff08;PD&#xff09; 静态性能-滞后校正 阶跃曲线、频域&#xff08…

Flink CDC MongoDB 联合实时数仓的探索实践

摘要&#xff1a;本文整理自 XTransfer 技术专家, Flink CDC Maintainer 孙家宝&#xff0c;在 Flink Forward Asia 2022 数据集成专场的分享。本篇内容主要分为四个部分&#xff1a; MongoDB 在实时数仓的探索 MongoDB CDC Connector 的实现原理和使用实践 FLIP-262 MongoDB…

Spring MVC拦截器和跨域请求

一、拦截器简介 SpringMVC的拦截器&#xff08;Interceptor&#xff09;也是AOP思想的一种实现方式。它与Servlet的过滤器&#xff08;Filter&#xff09;功能类似&#xff0c;主要用于拦截用户的请求并做相应的处理&#xff0c;通常应用在权限验证、记录请求信息的日志、判断用…

多肽试剂1801415-23-5,Satoreotide,UNII-S58172SSTS,应用在多肽标记及修饰上

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ Satoreotide&#xff0c;UNII-S58172SSTS Product structure Product specifications 1.CAS No&#xff1a;1801415-23-5 2.Molecular formula&#xff1a;C58H72ClN15O14S2 3.Molecular weight&#xff1a;1302.9 4.Packa…