0

0

php惯用的排序算法与二分法查找

php中文网

php中文网

发布时间:2016-06-13 12:29:13

|

933人浏览过

|

来源于php中文网

原创

php常用的排序算法与二分法查找

一 : 归并排序

将两个的有序数列合并成一个有序数列,我们称之为"归并"。
归并排序(Merge Sort)就是利用归并思想对数列进行排序。根据具体的实现,归并排序包括"从上往下"和"从下往上"2种方式。


1. 从下往上的归并排序:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这些数列两两合并;得到若干个长度为4的有序数列,再将它们两两合并;直接合并成一个数列为止。这样就得到了我们想要的排序结果

2. 从上往下的归并排序:它与"从下往上"在排序上是反方向的。它基本包括3步:
① 分解 -- 将当前区间一分为二,即求分裂点 mid = (low + high)/2; 
② 求解 -- 递归地对两个子区间a[low...mid] 和 a[mid+1...high]进行归并排序。递归的终结条件是子区间长度为1。
③ 合并 -- 将已排序的两个子区间a[low...mid]和 a[mid+1...high]归并为一个有序的区间a[low...high]。

    /**      * 归并排序实现过程      * @param Array $arr 待排序的区间数组      * @param Int $start 第一个区间数组的起始位置      * @param Int $mid 第一个区间数组的结束位置,第二个区间数组的起始位置      * @param Int $end 第二个区间数组的结束位置      * @return void      */    function merge(Array &$arr,$start,$mid,$end)    {        $i = $start;        $j = $mid + 1;        $k = 0;         while($i <= $mid && $j <= $end)        {            if ($arr[$i] <= $arr[$j])    //判断两个区间数组各自数据的大小,并归类                $tmp[$k++] = $arr[$i++];            else                $tmp[$k++] = $arr[$j++];        }        while($i <= $mid)    //防止第一个区间有一个数据没有归类            $tmp[$k++] = $arr[$i++];        while($j <= $end) //防止第二个区间有一个数据没有归类            $tmp[$k++] = $arr[$j++];        // 将排序后的元素,全部都整合到数组arr中。        for ($i = 0; $i < $k; ++$i)            $arr[$start + $i] = $tmp[$i];    }    /**      * 归并排序(从上往下)      * @param Array $arr 待排序的数组      * @param Int $start 数组起始位置      * @param Int end 数组结束位置      * @return void      */    function merge_sort(Array &$arr,$start=0,$end=0)    {        $len = count($arr);        if($len <= 1 || $start >= $end)            return $arr;        $mid = intval(($start + $end) / 2); //分区间            merge_sort($arr,$start,$mid);        merge_sort($arr,$mid+1,$end);        merge($arr,$start,$mid,$end);    }

//从下往上与此刚好相反

二 : 快速排序

立即学习PHP免费学习笔记(深入)”;

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序主体算法时间运算量约 O(log2n) ,划分子区函数运算量约 O(n) ,所以总的时间复杂度为 O(nlog2n) ,它显然优于冒泡排序 O(n2). 可是算法的优势并不是绝对的。试分析,当原文件关键字有序时,快速排序时间复杂度是 O(n2), 这种情况下快速排序不快。而这种情况的冒泡排序是 O(n), 反而很快。在原文件记录关键字无序时的多种排序方法中,快速排序被认为是最好的一种排序方法。

    /**      * 快速排序      * @param Array $arr 待排序的数组      * @return Array 排序后的数组      */    function quick_sort(Array $arr)    {        $len = count($arr);        if($len <= 1)            return $arr;        $tmp = $arr[0];        $left_arr = [];        $right_arr = [];        for($i = 1; $i < $len; ++$i)        {            if($arr[$i] <= $tmp)                $left_arr[] = $arr[$i];            else                $right_arr[] = $arr[$i];        }        //递归分类        $left_arr = quick_sort($left_arr);        $right_arr = quick_sort($right_arr);        return array_merge($left_arr,array($tmp),$right_arr);    }    

三 :冒泡排序

两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。该算法的时间复杂度为O(n2)。但是,当原始关键字序列已有序时,只进行一趟比较就结束,此时时间复杂度为O(n)。

基于VC与Matlab的混合编程实现图像的三维显示 WORD版
基于VC与Matlab的混合编程实现图像的三维显示 WORD版

本文档主要讲述的是基于VC与Matlab的混合编程实现图像的三维显示;介绍了VC++与Matlab混合编程的一般实现方法,并实现对二维影像图的三维效果显示。 MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载
    /**      * 冒泡排序      * @param Array $arr 待排序的数组      * @return Array 排序后的数组      */    function bubble_sort(Array $arr)    {        $len = count($arr);        for($i = 0; $i < $len; ++$i)        {            for($j = $len - 1; $j > $i; --$j)            {                if($arr[$j] < $arr[$j-1])                {                    $tmp = $arr[$j];                    $arr[$j] = $arr[$j-1];                    $arr[$j-1] = $tmp;                }            }        }        return $arr;    }

四 :插入排序

每次将一个待排序的数据元素插入到前面已经排好序的数列中,使数列依然有序,知道待排序数据元素全部插入完为止。如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择

    /**      * 插入排序      * @param Array $arr 待排序的数组      * @return Array 排序后的数组      */    function insert_sort(Array $arr)    {        $len = count($arr);        for($i = 1; $i < $len; ++$i)        {            $tmp = $arr[$i];            $j = $i - 1;            //把数据插入到合适的位置(交换位置)            while($j >= 0 && $arr[$j] > $tmp)            {                $arr[$j+1] = $arr[$j];                $arr[$j] = $tmp;                --$j;            }        }        return $arr;    }

五 :选择排序

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。时间复杂度为o(n2),不稳定排序,适合规模比较小的

    /**      * 选择排序      * @param Array $arr 待排序的数组      * @return Array 排序后的数组      */    function select_sort(Array $arr)    {        $len = count($arr);        for($i = 0; $i < $len; ++$i)        {            $k = $i;    //标记当前索引            for($j = $i + 1; $j < $len; ++$j)            {                if($arr[$j] < $arr[$k])                    $k = $j; //获取当前最小值索引                if($k != $i) //如果最小值得索引发生变化                {                    $tmp = $arr[$i];                    $arr[$i] = $arr[$k];                    $arr[$k] = $tmp;                }            }        }        return $arr;    }

六 :二分查找

    /**      * 二分查找      * @param Array $arr 待查找的数组      * @param Int $key 要查找的关键字      * @return Int      */    function bin_search(Array $arr,$key)    {        $high = count($arr);        if($high <= 0)            return 0;        $low = 0;        while($low <= $high)        {                 //当前查找区间arr[low..high]非空              $mid=intval(($low + $high) / 2);            if($arr[$mid] == $key)                 return $mid; //查找成功返回            if($arr[$mid] > $key)                $high = $mid - 1; //继续在arr[low..mid-1]中查找            else                $low = $mid + 1; //继续在arr[mid+1..high]中查找        }        return 0; //当low>high时表示查找区间为空,查找失败    }    $arr = array(1,2,4,6,10,40,50,80,100,110);    echo bin_search($arr,80);

 

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

9

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

18

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

10

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

2

2026.02.03

漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

8

2026.02.03

Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口
Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口

本专题汇总了俄罗斯知名搜索引擎 Yandex 的官网入口、免登录访问地址、中文登录方法与网页版使用指南,帮助用户稳定访问 Yandex 官网,并提供一站式入口汇总。无论是登录入口还是在线搜索,用户都能快速获取最新稳定的访问链接与使用指南。

68

2026.02.03

Java 设计模式与重构实践
Java 设计模式与重构实践

本专题专注讲解 Java 中常用的设计模式,包括单例模式、工厂模式、观察者模式、策略模式等,并结合代码重构实践,帮助学习者掌握 如何运用设计模式优化代码结构,提高代码的可读性、可维护性和扩展性。通过具体示例,展示设计模式如何解决实际开发中的复杂问题。

2

2026.02.03

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2

2026.02.03

Python 强化学习与深度Q网络(DQN)
Python 强化学习与深度Q网络(DQN)

本专题深入讲解 Python 在强化学习(Reinforcement Learning)中的应用,重点介绍 深度Q网络(DQN) 及其实现方法,涵盖 Q-learning 算法、深度学习与神经网络的结合、环境模拟与奖励机制设计、探索与利用的平衡等。通过构建一个简单的游戏AI,帮助学习者掌握 如何使用 Python 训练智能体在动态环境中作出决策。

2

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP函数之array数组函数视频讲解
PHP函数之array数组函数视频讲解

共76课时 | 26.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号