PHP编程中的常用排序算法及二分查找方法详解

更新:11-02 名人轶事 我要投稿 纠错 投诉

这篇文章给大家聊聊关于PHP编程中的常用排序算法及二分查找方法详解,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

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

从上往下的归并排序:与“自下而上”排序相反的方向。它基本上由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 第二个范围数组的结束位置

* @返回无效*/

函数合并(数组$arr,$start,$mid,$end)

{

$i=$开始;

$j=$mid + 1;

$k=0;

而($ i=$ mid $ j=$ end)

{

if ($arr[$i]=$arr[$j]) //判断两个区间数组各自数据的大小,并进行分类

$tmp[$k++]=$arr[$i++];

别的

$tmp[$k++]=$arr[$j++];

}

while($i=$mid) //防止第一个区间有未分类的数据

{

$tmp[$k++]=$arr[$i++];

}

while($j=$end) //防止第二个区间有未分类的数据

{

$tmp[$k++]=$arr[$j++]; //将所有排序后的元素整合到数组arr.

}

对于($i=0; $i $k; ++$i)

$arr[$start + $i]=$tmp[$i];

} /**

* 归并排序(从上到下)

* @param Array $arr 要排序的数组

* @param Int $start 数组起始位置

* @param Int 结束数组结束位置

* @返回无效*/

函数merge_sort(数组$arr,$start=0,$end=0)

{

$len=计数($arr);

if($len=1 || $start=$end)

返回$arr;

$mid=intval(($start + $end)/2); //分区之间

merge_sort($arr,$start,$mid);

merge_sort($arr,$mid+1,$end);

合并($arr,$start,$mid,$end);

}

//与此相反从下到上:快速排序

通过一次排序将待排序的数据分成两个独立的部分。一部分中的所有数据都小于另一部分中的所有数据。然后用这个方法分别对两部分数据进行快速排序。整个排序过程可以递归地进行,从而使整个数据成为一个有序的序列。快速排序算法主要运算时间约为O(log2n),分区域函数运算时间约为O(n),所以总时间复杂度为O(nlog2n),明显优于冒泡排序O(n2)。然而,算法的优势并不是绝对的。试验分析表明,当原始文件关键字有序时,快速排序的时间复杂度为O(n2)。在这种情况下,快速排序并不快。在这种情况下,冒泡排序是O(n),速度非常快。在原始文件记录关键字乱序时的各种排序方法中,快速排序被认为是最好的排序方法。

/**

* 快速排序

* @param Array $arr 要排序的数组

* @return Array 排序数组*/

函数快速排序(数组$arr)

{

$len=计数($arr);

如果($len=1)

返回$arr;

$tmp=$arr[0];

$left_arr=[];

$right_arr=[];

for($i=1; $i $len; ++$i)

{

if($arr[$i]=$tmp)

$left_arr[]=$arr[$i];

别的

$right_arr[]=$arr[$i];

} //递归分类

$left_arr=Quick_sort($left_arr);

$right_arr=快速排序($right_arr);

返回array_merge($left_arr,array($tmp),$right_arr);

}三:冒泡排序

两两比较待排序数据元素的大小,如果发现两个数据元素的顺序颠倒,则进行交换,直到没有颠倒的数据元素为止。该算法的时间复杂度为O(n2)。然而,当原始关键字序列有序时,只进行一次比较,时间复杂度为O(n)。

/**

* 冒泡排序

* @param Array $arr 要排序的数组

* @return Array 排序数组*/

函数bubble_sort(数组$arr)

{

$len=计数($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;

}

}

}

返回$arr;

}四:插入排序

每次将一个待排序的数据元素插入到之前已排序的数组中,使得数组保持有序,直到所有待排序的数据元素都插入完毕。如果目标是按升序对n 个元素的序列进行排序,则使用插入排序有最好和最坏的情况。最好的情况是序列已经按升序排列。在这种情况下,需要执行的比较操作只需要(n-1)次。最坏的情况是序列是降序排列的,所以此时总共需要进行n(n-1)/2次比较。插入排序的赋值操作是比较操作的次数加(n-1)次。平均而言,插入排序算法的时间复杂度为O(n^2)。因此,插入排序不适合数据量比较大的排序应用。但是,如果需要排序的数据量较小,例如数量级小于千,那么插入排序仍然是一个不错的选择。

/**

* 插入排序

* @param Array $arr 要排序的数组

* @return Array 排序数组*/

函数insert_sort(数组$arr)

{

$len=计数($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;

}

}

返回$arr;

}五:选择排序

每一遍从待排序的数据元素中选择最小(或最大)的元素,并将其放置在已排序数组的末尾,直到所有待排序的数据元素都用完。时间复杂度为o(n2),排序不稳定,适合小规模

/**

* 选择排序

* @param Array $arr 要排序的数组

* @return Array 排序数组*/

函数select_sort(数组$arr)

{

$len=计数($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;

}

}

}

返回$arr;

}6:二分查找

/**

*二分查找

* @param Array $arr 要搜索的数组

* @param Int $key 要查找的关键字

* @return 整数*/

函数bin_search(数组$arr,$key)

{

$high=计数($arr);

如果($最高=0)

返回0;

$低=0;

而($低=$高)

{

//当前搜索区间arr[low.high]不为空

$mid=intval(($low + $high)/2);

if($arr[$mid]==$key)

返回$mid; //查找成功返回

if($arr[$mid] $key)

$high=$mid - 1; //继续在arr[low.mid-1]中查找

别的

$低=$中+ 1; //继续在arr[mid+1.high]中查找

}

返回0; //当lowhigh时,表示搜索区间为空,搜索失败。

}

用户评论

肆忌

终于学习到排序了!PHP自带哪些排序方法呢?

    有5位网友表示赞同!

秒淘你心窝

感觉这篇文章应该涵盖一下比较常见的排序方式吧,比如冒泡、插入、快速排序等等。

    有12位网友表示赞同!

经典的对白

二分法查找是蛮奇妙的,效率是不是比顺序查找高很多啊?

    有11位网友表示赞同!

夏至离别

我经常遇到需要对数据进行排序的需求,这篇博客刚好可以给我一些思路。

    有18位网友表示赞同!

海盟山誓总是赊

学习php排序算法和二分法查找,应该能帮我处理代码中的复杂逻辑。

    有15位网友表示赞同!

别伤我i

不知道这篇文章也会讲到排序的不同时间复杂度和空间复杂度的比较吗?

    有13位网友表示赞同!

采姑娘的小蘑菇

我之前一直用内置的sort函数,现在打算自己实现排序算法看看效果。

    有12位网友表示赞同!

雁過藍天

这听起来很有意思啊,我要好好去看一下!

    有14位网友表示赞同!

隔壁阿不都

PHP中还有哪些其他的查找算法呢?这篇博客会不会也提到?

    有7位网友表示赞同!

像从了良

二分法在实际应用中比较常见吗?有哪些优缺点呢?

    有5位网友表示赞同!

忘故

希望这篇文章能讲解得清晰详细,让我能充分理解排序算法和二分法查找。

    有7位网友表示赞同!

北染陌人

学习这些算法应该可以帮助我写更高效的程序代码!

    有17位网友表示赞同!

歇火

感觉这篇文章能够帮我在面试中脱颖而出!

    有17位网友表示赞同!

素婉纤尘

PHP真是个强大语言啊!功能这么多。

    有8位网友表示赞同!

醉红颜

这篇文章让我对PHP排序算法有了更深刻的认识,太棒了!

    有10位网友表示赞同!

安陌醉生

学习这些算法知识可以使我成为一名更优秀的程序员!

    有13位网友表示赞同!

见朕骑妓的时刻

我要收藏这篇博文,等到需要用到的时候再仔细阅读!

    有10位网友表示赞同!

抚笙

希望这篇文章能提供一些编程技巧和案例,这样更有实际的指导意义。

    有18位网友表示赞同!

灵魂摆渡人

学习这些算法是提升代码质量的关键步骤!

    有9位网友表示赞同!

【PHP编程中的常用排序算法及二分查找方法详解】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:探索内心和谐与世间责任的完美融合 下一篇:揭秘热门手机赚钱应用:十大赚钱软件榜单!