php 冒泡排序的两种思路以及优化
php冒泡排序,两种思路,时间复杂度都是O(n^2),当然最优的时间复杂度就是O(n),以下说的都是正序排列(倒序的话,把内层循环的大于号换成小于号就好了)
第一种冒泡排序
思路就是把第一个数跟所有的数比较,如果碰到比第一个数还小的数字,就把他俩位置交换下,然后把交换后的数字继续往后比较...
这样第一轮交换能得出什么呢,就是第一轮交换完,数组的第一个位置,一定是最小的数
循环体内,每次$j = $i + 1, 因为外层每循环一次已经把最小的数压到数字头部了, 没必要从头开始比较了
$numbers = array(-2, 5, 3, 1, -3, -4);
for ($i=0;$i<count($numbers);$i++) {
for ($j=$i+1;$j<count($numbers);$j++) {
if ($numbers[$i] > $numbers[$j]) {
$tmp = $numbers[$i];
$numbers[$i] = $numbers[$j];
$numbers[$j] = $tmp;
}
}
// var_dump($numbers);
}
var_dump($numbers);exit;
第一轮交换的过程:拿数组的第一位-2跟5比,发现没有我小,跳过,拿-2跟3比,发小没有我小跳过...
拿-2跟-3比的时候,发小比我还小,两个交换下位置,下次循环的时候数组第一位已经发生了变化,是-3。嗯,仔细想想
然后循环还没完,继续拿数组的第一位(-3),跟数组最后一位-4比较,又交换下位置...
结果:[-4, 5, 3, 1, -2, -3]
第二轮循环时候拿5跟数组后面的开始比较,没必要跟前面的比了,因为经过上一轮的比较,第一位肯定是最小的...
第二种冒泡排序
思路就是一组一组数字(相邻的两个数)比较,如果大于后面的数字就发生交换,这样比较完的结果就是会把最大的数移动到最后的位置
$numbers = array(-2, 5, 3, 1, -3, -4);
for ($i = 0; $i < count($numbers); $i++) {
for ($j = 0; $j < count($numbers) - $i - 1; $j++) {
if ($numbers[$j] > $numbers[$j + 1]) {
$temp = $numbers[$j];
$numbers[$j] = $numbers[$j + 1];
$numbers[$j + 1] = $temp;
}
}
var_dump($numbers);
}
第一轮交换完过程就是: -2不大于5不交换,5大于3交换,5大于1交换,5大于-3交换,5大约-4交换....
结果: [-2, 3, 1, -3, -4,5]
...
第二轮交换的时候,注意条件$j < count($numbers) - $i - 1; 已经不跟最后一个比较了,因为你懂的...
关于优化
如果数组是: [5,1,2,3,4] 套用我们第二种思路的话, 是不是我们第一轮循环完(结果是[1,2,3,4,5]), 就可以终止循环了.
加个变量,如果里面没有发生交换,就意味着数组目前就是有序的,可以退出循环了
$numbers = [5,1,2,3,4];
for ($i = 0; $i < count($numbers); $i++) {
$flag = 1;
for ($j = 0; $j < count($numbers) - $i - 1; $j++) {
if ($numbers[$j] > $numbers[$j + 1]) {
$flag = 0;
$temp = $numbers[$j];
$numbers[$j] = $numbers[$j + 1];
$numbers[$j + 1] = $temp;
}
}
if($flag) break;
}
var_dump($numbers);exit;
php 冒泡排序的两种思路以及优化的更多相关文章
- 使用 CUDA 进行计算优化的两种思路
前言 本文讨论如何使用 CUDA 对代码进行并行优化,并给出不同并行思路对均值滤波的实现. 并行优化的两种思路 思路1: global 函数 在 global 函数中创建出多个块多个线程对矩阵每个元素 ...
- 第七篇:使用 CUDA 进行计算优化的两种思路
前言 本文讨论如何使用 CUDA 对代码进行并行优化,并给出不同并行思路对均值滤波的实现. 并行优化的两种思路 思路1: global 函数 在 global 函数中创建出多个块多个线程对矩阵每个元素 ...
- 点击页面div弹窗以外隐藏的两种思路
在本文为大家介绍两种思路实现点击页面其它地方隐藏该div,第一种是对document的click事件绑定事件处理程序.. 第一种思路分两步 第一步:对document的click事件绑定事件处理程序, ...
- 把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进)
#把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进) ##背景 项目中经常需要把JSON数据填充到页面表单,一开始我使用easyui自带的form load方法,觉得效率很低,经 ...
- C++关于数字逆序输出的两种思路,及字符串逆序输出
C++关于数字逆序输出的两种思路,及字符串逆序输出 作者:GREATCOFFEE 发布时间:NOVEMBER 15, 2012 分类:编程的艺术 最近在跟女神一起学C++(其实我是不怀好意),然后女神 ...
- Java实现快排+小坑+partition的两种思路
在做一道剑指Offer的题的时候,有道题涉及到快排的思路,一开始就很快根据以前的思路写出了代码,但似乎有些细节不太对劲,自己拿数据试了下果然.然后折腾了下并记录下一些小坑,还有总结下划分方法parti ...
- WebGIS中解决使用Lucene进行兴趣点搜索排序的两种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 目前跟信息采集相关的一个项目提出了这样的一个需求:中国银行等 ...
- 点击页面其它地方隐藏该div的两种思路
思路一 第一种思路分两步 第一步:对document的click事件绑定事件处理程序,使其隐藏该div 第二步:对div的click事件绑定事件处理程序,阻止事件冒泡,防止其冒泡到document,而 ...
- 对抗栈帧地址随机化/ASLR的两种思路和一些技巧
栈帧地址随机化是地址空间布局随机化(Address space layout randomization,ASLR)的一种,它实现了栈帧起始地址一定程度上的随机化,令攻击者难以猜测需要攻击位置的地址. ...
随机推荐
- pickle 继承
1.什么是方法,什么是函数 class Foo: def chi(self): print("我是吃") @staticmethod def static_method(): pa ...
- 100度享乐电商网 jQuery
$(function() {// x表示不会的需要注意 //新闻走马灯 x var num = 0 var len = $(".wrap ul li").length $(&qu ...
- struts2 18拦截器详解(十)
ModelDrivenInterceptor 该拦截器处于defaultStack中的第九的位置,在ScopedModelDrivenInterceptor拦截器之后,要使该拦截器有效的话,Actio ...
- 2016CVPR论文集
http://www.cv-foundation.org/openaccess/CVPR2016.py ORAL SESSION Image Captioning and Question Answe ...
- [C# 面试总结]9个点如何画10条线
问题描述 9个点画10条直线,要求每条直线上至少3个点,相信这道理题目很多朋友在面试的时候都遇到过的(同时自己在面试的时候也遇到过),所以这里记录下来以备复习. 解决方法1:
- UC浏览器 - 不负责任思考
前言 UC浏览器的辉煌应该是我读大学(2008年)的时候,转眼间,十年过去了,庆幸的是UC还在,我从使用者变成了一名UC的员工. 以下都是个人的不负责任的猜想或者思考 变更 塞班时代 UC浏览器的地位 ...
- NLog配置JsonLayout中文输出为unicode问题
日志输出现要改为json格式,网上查询layout配置为JsonLayout就可以了,结果发现输出中文为unicode编码,看很多文章说配置encode="false"就可以了,结 ...
- C#实时检测端口占用情况
在TCP/IP协议中,服务端需要去监听客户端的端口,开始监听,我们需要检测使用的端口是否被占用,获取系统当前使用的所有端口号,用此端口进行匹配即可. 代码如下 internal static Bool ...
- 使用sqlmap对进行php+mysql注入实战
作者:陈小兵一般来讲一旦网站存在sql注入漏洞,通过sql注入漏洞轻者可以获取数据,严重的将获取webshell以及服务器权限,但在实际漏洞利用和测试过程中,也可能因为服务器配置等情况导致无法获取权限 ...
- linux apache+php+mysql安装及乱码解决办法
1.乱码解决方法 首先确认mysql数据库字符集设置正确,php页面字符设置正确,之后修改apache配制文件http.conf 注释掉以下字符 AddDefaultCharset UTF-8 此为乱 ...