经常有人说:“连数据结构和算法都不懂,也敢说自己会编程!”没有学过编译型语言的同学立马被这句话吓怕了。因为作为一名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)开始,跟紧挨的元素比较,并进行交换(需要的时候)
上代码:
对于冒泡排序一定要理解它的思想,不要去死记代码,不一定非得按照上面那样写,也可以这样写:
冒泡排序是一种常用的排序方法,比较稳定,也是效率比较低的一种排序,数据量小了没什么,大了明显和其他排序方法有差距。
冒泡排序加强版:
上述例子对冒泡排序做了优化,添加$flag做标记,记录数组是否已有序,减少了循环次数。