第五章:PHP编程思想提升篇——冒泡排序

更新于:2017-04-20 19:35:56

经常有人说:“连数据结构和算法都不懂,也敢说自己会编程!”没有学过编译型语言的同学立马被这句话吓怕了。因为作为一名PHPer在开发项目中好像真不怎么用到数据结构和算法,就算一点不懂数据结构和算法也不影响写代码,谁让PHP是做web开发呢,天生的业务应用型语言,擅长写业务逻辑,没有人会用PHP开发数据库这类“对数据做大型操作”的软件。


PHPer不学数据结构和算法没问题不影响使用,可有人说了“不学数据结构和算法是成不了优秀的程序员的”,那我们多多少少还是要了解些的,尤其初学编程的朋友,可以拓展思路。


数据结构先不讲,只说算法。什么是算法?楠神个人的理解:对指定的数据做处理,达到特定的效果。比如说对一组数字做排序,对一组数据加密,对一组数据压缩。好的算法就是对一组数字排序越快越好(循环次数越少越好),对一组数据加密越快、难破解越好,对一组数据确保可逆的情况下越小越好。排序不用说了吧,用途太广泛了,从数据库获取数据通常会有排序的需求,比如淘宝按条件搜索的商品展示。加密嘛,多用于数据传输安全问题。压缩也很有用,比方说有人设计出一种算法能把一个G的电影使劲压缩成100M或10M,而且能恢复正常播放,那太牛了,以后下片片一分钟就搞定了。


算法我们只讲排序算法,分别是:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序。PHPer起码要会写冒泡排序。


冒泡排序:


将下列数组进行正序(从小到大)排列出来


$arr = [5,17,3,9,8,12];


逻辑描述:对该数组从第一个元素开始,从左到右,相邻的2个元素比较大小:如果左边的比右边的大,则将他们俩交换位置,结果:


[5,17,3,9,8,12];// 5 < 17 不交换

[5,17,3,9,8,12];// 17 > 3 交换

[5,3,17,9,8,12];// 17 > 9 交换

[5,3,9,17,8,12];// 17 > 8 交换

[5,3,9,8,17,12];// 17 > 12 交换

[5,3,9,8,12,17];// 第一轮结束


此时,才“走完一轮回”,继续下一轮:


[5,3,9,8,12,17];// 5 > 3 交换

[3,5,9,8,12,17];// 5 < 9 不交换

[3,5,9,8,12,17];// 9 > 8 交换

[3,5,8,9,12,17];// 9 < 12 不交换

[3,5,8,9,12,17];// 第二轮结束


继续下轮……


最初:

5

17

3

9

8

12

1趟之后:

5

3

9

8

12

17

2趟之后

3

5

8

9

12

17

3趟之后

3

5

8

9

12

17

4趟之后

3

5

8

9

12

17

5趟之后

3

5

8

9

12

17


逻辑描述(假设数组有n项):

1, 需要进行n-1趟的“冒泡”比较过程。

2, 每一趟的比较都比前一趟少比一次,第一趟需要比较n-1次

3, 每趟比较,都是从数组的开头(0)开始,跟紧挨的元素比较,并进行交换(需要的时候)


上代码:


1.png

1.png

对于冒泡排序一定要理解它的思想,不要去死记代码,不一定非得按照上面那样写,也可以这样写:


1.png


冒泡排序是一种常用的排序方法,比较稳定,也是效率比较低的一种排序,数据量小了没什么,大了明显和其他排序方法有差距。


冒泡排序加强版:


1.png

上述例子对冒泡排序做了优化,添加$flag做标记,记录数组是否已有序,减少了循环次数。


本节学习代码》》》