php排序算法

一,冒泡排序
复制代码
	冒泡排序是最简单最通用的一种排序,基本思想:在一组数据中,每次将相邻的两个数来比较,如果前面的数比后面的数大,就交换两个数的位置,否则不交换。由此可得,在排序过程中,大的数据往下沉,小的数据往上浮,就像气泡一样,于是将这种排序算法形象地称为冒泡排序。

设数组长度为N。

1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。

2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就"沉"到数组第N-1个位置。

3.N=N-1,如果N不为0就重复前面二步,否则排序完成。

php 复制代码
function bubble_sort($arr){
	$count=count($arr) - 1;
    for($i=0;$i<$count;$i++){
        for($j=0;$j<$count-$i;$j++){
            if($arr[$j] > $arr[$j+1]){
                $tmp=$arr[$j];
                $arr[$j]=$arr[$j+1];
                $arr[$j+1]=$tmp;
            }
        }
        
    }
    return $arr;
}
$newarr=bubble_sort(['10','4','9','3']);

分析:外层遍历,i=0的时候,就是拿 10 和内层 ['10','4','9','3'] 依次做比较,如果 a r r [ arr[ arr[j] 大于 a r r [ arr[ arr[j+1],那就两个元素交换位置。交换完之后是 4,10,9,3;此时j=1,比较并交换位置之后 为 4,9,10,3 。直到第一轮遍历完之后为 4,9,3,10 。每进行一轮内层遍历,都会让一个最大的数到最后一个位置。

第二轮,i=1,手机用4,9,3,10遍历比较完之后为 4,3,9,10

二,快速排序
复制代码
它以递归的方式对待排序数据进行排序。快速排序的基本思路是将待排序数据序列划分成两个子序列,一个子序列中所有元素都比另一个子序列中的元素小(或大),再对这两个子序列递归进行快速排序,直到每个子序列只有一个元素为止。

1.从数列中挑出一个元素,称为"基准值";

2.将待排序元素进行分区,比基准值小的元素放在基准值前面,比基准值大的元素放在基准值后面。分区结束后,该基准值就处于数组的中间位置;

3.对左右两个分区重复以上步骤直到所有元素都是有序的。

php 复制代码
function fast_sort($arr){
    //如果数组长度小于等于1,直接返回数组
    if(count($arr)<=1){
        return $arr;
    }
    //选择一个基准元素,可以是数组中任意一个,将数组分成两部分
    $povit=$arr[0];
    $left=$right=array();
    $count=count($arr);
    for($i=1;$i<$count;$i++){
        if($arr[$i] < $povit){
            $left[]=$arr[$i];
        }else{
            $right[]=$arr[$i];
        }
    }
    //递归的对左右两个子数组进行分割排序,最后将结果合并
    return array_merge(fast_sort($left),array($povit),fast_sort($right));
}

var_dump(fast_sort([10,4,9,3,2]));
三,插入排序
复制代码
从数组第二位开始遍历,和前面的数比较,符合就互换位置,直到遍历所有数
php 复制代码
function insert_sort($arr) {
   $count = count($arr); //计算排序元素个数
    /**
     * 第一层循环用于从未排序区域中取出待排序元素,并逐步缩小未排序区域,
     * 第二层循环用于从已排序区域中寻找插入位置      * 
     */
    for ($i = 1; $i < $count; $i++)
    {
        //获得当前需要比较的元素值
        $temp = $arr[$i];
        //内层循环控制 比较 并 插入
        for ($j = $i-1; $j >= 0; $j--)  
        {
            /**
             * $temp需要插入的元素;
             * $arr[$j]需要比较的元素
             */
            if($arr[$j] > $temp)
            {
                /**
                 * 发现插入的元素要小,交换位置
                 * 将后边的元素与前面的元素互换
                 */
                $arr[$j+1] = $arr[$j];
                //将前面的数设置为当前需要交换的数
                $arr[$j] = $temp;
            }
        }
    } 
    //将这个元素 插入到已经排序好的序列内,返回
    return $arr;
}
var_dump(insert_sort([10,4,9,3,2]));
相关推荐
徐子童2 分钟前
《从零开始入门递归算法:搜索与回溯的核心思想 + 剑指Offer+leetcode高频面试题实战(含可视化图解)》
算法
天宫风子24 分钟前
抽象代数小述(二之前)
经验分享·笔记·算法·生活·抽象代数
向上的车轮37 分钟前
“傅里叶变换算法”来检测纸箱变形的简单示例
算法
九亿AI算法优化工作室&1 小时前
乡村地区无人机医药配送路径规划与优化仿真
人工智能·算法·matlab·回归
米粉03051 小时前
算法图表总结:查找、排序与递归(含 Mermaid 图示)
数据结构·算法·排序算法
人类发明了工具1 小时前
【优化算法】协方差矩阵自适应进化策略(Covariance Matrix Adaptation Evolution Strategy,CMA-ES)
线性代数·算法·矩阵·cma-es
黑色的山岗在沉睡1 小时前
LeetCode100.4 移动零
数据结构·算法·leetcode
方博士AI机器人2 小时前
算法与数据结构 - 二叉树结构入门
数据结构·算法·二叉树
-qOVOp-2 小时前
zst-2001 上午题-历年真题 算法(5个内容)
算法
绵山介子推2 小时前
IP地址、端口、TCP介绍、socket介绍、程序中socket管理
网络协议·tcp/ip·php·嵌入式软件