程序 = 数据结构 + 算法,算法是程序的灵魂,有些网站能够在高并发、大数据的情况下依旧坚挺。我们可能会说,那是因为运用了服务器集群,数据库读写分离,缓存技术等等。但是这些优化技术是如何实现的呢?这就要问问哪些高明的算法工程师了。所以对于WEB开发而言,虽然用到算法的地方不多,但是了解一些常用的算法还是很有必要的,这样才能看懂一些“高明”的程序设计技巧。
下面,是一些常用的排序算法,包括冒泡排序,选择排序,快速排序和插入排序。我会通过一些示例,对一个一维数组进行从小到大排序。
冒泡排序
<?php
//冒泡排序
//冒泡排序因排序过程形似冒泡而得名。
$arr = [5,5,2,3,1,6,8,4];
function maopao($arr)
{
$len = count($arr);
for ($i=0; $i<$len-1; $i++) { //实际只循环了$len-1次
for ($j=$len-1; $j>$i; $j--) {
if ($arr[$j]<$arr[$j-1]) {
$swap = $arr[$j];
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $swap;
}
}
}
var_export($arr);
}
maopao($arr);
echo "<hr/>";
选择排序
//选择排序
//思路十分简单的一种排序方式,从头开始,逐次和后面的值相比较。
function xuanze($arr)
{
$len = count($arr);
for ($i=0; $i<$len; $i++) {
for ($j=$i+1; $j<$len; $j++) {
if ($arr[$j]<$arr[$i]) {
$swap = $arr[$j];
$arr[$j] = $arr[$i];
$arr[$i] = $swap;
}
}
}
var_export($arr);
}
xuanze($arr);
echo "<hr/>";
优化选择排序
//选择排序和冒泡排序都进行了大量的交换,其实仔细思考就会发现,这些交换并不一定都是必要的。
//那么我是不是可以在每组比较的过程中,不进行交换,只是记录key值,在比较的最后,再进行交换。下面对选择排序进行优化
function xuanze2($arr)
{
$len = count($arr);
for ($i=0; $i<$len; $i++) {
$t = $i;
for ($j=$i+1; $j<$len; $j++) {
if ($arr[$t]>$arr[$j]) {
$t = $j;
}
}
if ($t != $i) {
$swap = $arr[$t];
$arr[$t] = $arr[$i];
$arr[$i] = $swap;
}
}
var_export($arr);
}
xuanze2($arr);
echo "<hr/>";
快速排序
//和它的名字一样,快排是速度非常快的一种排序。排序思路就是运用递归。
//第一次,在数组中选定一个中间数,讲比它小的放在左边;比它大的放在右边。
//第二次,将第一次分好的堆,继续重复第一次的规则......
function kuaipai($arr) {
@$t = $arr[0];
$len = count($arr);
if ($len<=1) {
return $arr;
}
$arr1 = [];
$arr2 = [];
for ($i=1; $i<$len; $i++) {
if ($arr[$i]<=$t) {
$arr1[] = $arr[$i];
} else {
$arr2[] = $arr[$i];
}
}
return array_merge(kuaipai($arr1), array($t), kuaipai($arr2));
}
$arr = kuaipai($arr);
var_export($arr);
echo "<hr/>";
插入排序
//第一个元素被认为是已排序元素.
//未排序元素从已排序元素中从前往后进行比较
//若已排序元素大于等于未排序元素,则将已排序元素向后移一位。
function charu($arr)
{
$len = count($arr);
for ($i=1; $i<$len; $i++) {
$j = $i-1;
$tmp = $arr[$i];
while($j>=0&&$arr[$j]>$tmp){
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
$j--;
}
}
var_export($arr);
}
charu($arr);
echo "<hr/>";
算法,是一门需要仔细琢磨的程序设计的“艺术”,我想作为web开发程序员,不应该对其怀有“抵制”心态,而是坦然的接受,学习,思考,并加以总结。。。