PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
作者:LSGOZJ 发布时间:2024-05-13 09:25:52
本文实例讲述了PHP排序算法之冒泡排序(Bubble Sort)实现方法。分享给大家供大家参考,具体如下:
基本思想:
冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
最简单排序实现:
我们先来看看在没有学习各种排序方法前经常使用的排序方法(至少我是这样。。。。):
//这里使用了类型提示(type hint) array,不熟悉或者不习惯的同学大可去掉,不影响运算结果
function MySort(array &$arr){
$length = count($arr);
for($i = 0;$i < $length - 1;$i ++){
for($j = $i + 1;$j < $length;$j ++){
//将小的关键字放前面
if($arr[$i] > $arr[$j]){
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
}
}
$arr = array(9,1,5,8,3,7,4,6,2);
MySort($arr);
print_r($arr);
上面的这段代码严格意义上说,不算是标准的冒泡排序,因为它不满足“两两比较相邻记录”的冒泡排序思想,它仅仅是一个简单的交换排序。思路不过是:从第一个关键字开始,将每一位关键字与它后面的所有关键字相比较,交换得到其中的最小值。但这个算法是非常低效的。
冒泡排序算法:
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为数组中越大的元素会由于一次次排序后逐渐“沉”到数组的后面,而越小的元素会逐渐“浮”到数组的前面,故名。
冒泡排序算法的运作如下:(从后往前)
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
看文字描述不一定看得懂,看代码吧:
//交换方法
function swap(array &$arr,$a,$b){
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
}
//冒泡排序
function BubbleSort(array &$arr){
$length = count($arr);
for($i = 0;$i < $length - 1;$i ++){
//从后往前逐层上浮小的元素
for($j = $length - 2;$j >= $i;$j --){
//两两比较相邻记录
if($arr[$j] > $arr[$j + 1]){
swap($arr,$j,$j+1);
}
}
}
}
冒泡排序算法改进:
《大话数据结构》果然是本好书,还给我们介绍了冒泡排序算法的改进,这里我就直接搬它的陈述:
上面的冒泡排序算法是否还可以优化呢?答案是肯定的。试想一下,如果我们待排序的序列是{2,1,3,4,5,6,7,8,9},也就是说,除了第一和第二个关键字需要交换外,别的都已经是正常的顺序了。当 i = 0 时,交换了 2 和 1 ,此时的序列已经是有序的了,但是算法仍然不依不挠地将 i = 2 到 9 以及每个循环中的 j 循环都执行了一遍,尽管并没有交换数据,但是之后的大量比较还是大大地多余了。
当 i = 2 时,我们已经对 9 与 8,8 与 7,·······,3 与 2 做了比较,没有任何数据交换,这就说明此序列已经有序,不需要再继续后面的循判断工作了(后面的工作也是不会发生任何数据交换,再做也是没有意义了)。为了实现这个想法,我们需要改进一下代码,增加一个标记变量 flag 来实现这一算法的改进:
//交换方法
function swap(array &$arr,$a,$b){
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
}
/冒泡排序的优化(如果某一次循环的时候没有发生元素的交换,则整个数组已经是有序的了)
function BubbleSort1(array &$arr){
$length = count($arr);
$flag = TRUE;
for($i = 0;($i < $length - 1) && $flag;$i ++){
$flag = FALSE;
for($j = $length - 2;$j >= $i;$j --){
if($arr[$j] > $arr[$j + 1]){
swap($arr,$j,$j+1);
$flag = TRUE;
}
}
}
}
代码改动的关键就是在 i 变量的for循环中,增加了对flag是否为 true 的判断,经过这样的改进,冒泡排序在性能上就有了一些提升,可以避免因已经有序的情况下的无意义循环判断。
冒泡算法总的时间复杂度是 O(n^2)。
冒泡排序是稳定排序。
本文参考自《大话数据结构》,在此仅作记录,方便以后查阅,大神勿喷!
希望本文所述对大家PHP程序设计有所帮助。
来源:https://blog.csdn.net/baidu_30000217/article/details/53069390


猜你喜欢
- 我目标文件夹下有一大批图片,我要把它转变为指定尺寸大小的图片,用pthon和opencv实现的。以上为原图片。import cv2impor
- 编译环境:ubuntu17.04 Python3.5所需库:numpy、scipy、matplotlib下面是理想平面的辐射强度计算(课程大
- 定时器1-"*/5 * * * * *"package mainimport ("fmt""
- 本文实例讲述了Python实现曲线拟合操作。分享给大家供大家参考,具体如下:这两天学习了用python来拟合曲线。一、环境配置本人比较比较懒
- 系统存储过程,sp_executesql 语言在这里! sp_executesql 执行可以多次重用或动
- 前言当我们编写任何程序时,都会遇到一些错误,会让我们有挫败感,所以我有一个解决方案给你。 今天在这篇文章中,我们将讨论错误类型error:
- 一个很不错的效果,用键盘的箭头键控制一个漂亮的箭头!也许能给你启发,做出一款有趣的小游戏呢!运行代码框<html xmlns:v=&q
- 🔓一. CRUDCRUD : Create,Retrieve,Update,Delete新增数据查询数据修改数据删除数据MySQL的工作就是
- 1.collatz序列编写一个名为 collatz()的函数,它 有一个名为 number 的参数。如果参数是偶数, 那么 collatz(
- scratch-blocks编译的时候会出现的问题:scratch-gui依赖的scratch-blocks模块在安装的时候编译会报错。原因
- 1、合并列表(extend)跟元组一样,用加号(+)将两个列表加起来即可实现合并:In [1]: x=list(range(1, 13, 2
- 本文实例讲述了Python实现合并excel表格的方法。分享给大家供大家参考,具体如下:需求将一个文件夹中的excel表格合并成我们想要的形
- 不过首先你会发现,你在不同的地区或者不同的网络(电信、联通、移动)的情况下,转换后的IP地址很可能是 不一样的,这首先涉及到负载均衡的第一步
- 简单类型内置到 Python 编程语言中的简单数据类型包括: bool  
- 对于React,Vue构建的单页面应用老说,SEO是一个众所周知的问题。服务端渲染(SSR-server Side Render)是目前看来
- 目录一、索引基础1. 索引的类型1.1 B-Tree 索引1.2 哈希索引1.3 空间数据索引(R-Tree)1.4 全文索引二、索引的优缺
- 注意,要看懂这里,必须具备简单的Python数据分析知识,必须知道matplotlib的简单使用!例1:plt.subplot(221) #
- --已知:两种排名方式(分区和不分区):使用和不使用partition--两种计算方式(连续,不连续),对应函数:dense_rank,ra
- 不知道大家在做网站时有没有给目录名或者文件名添加”( )”的习惯,有则改之,无则加勉。因为他有潜在的危险,起码就被我遇到了。要使页面能够使用
- 下面先看下js禁止右击保存图片。禁止鼠标右键保存图片<img src="" oncontextmenu="