许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣。作为一个初级phper,虽然很少接触到算法方面的东西 。但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的。
冒泡排序算法
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,依次比较两个元素,如果他们的顺序错误就把他们交换过来。
/*** @param $arr* @return mixed** 冒泡排序算法的原理如下(效率比较低):* 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。* 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。* 3.针对所有的元素重复以上的步骤,除了最后一个。* 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。*/function bubble($arr){if (!is_array($arr)) {return '参数必须是一个一维数组';}$len = count($arr);//获取 长度$len = count($arr);//循环比较(相邻的两个元素,比较,交换)for ($k = 0; $k <= $len; $k++) {for ($j = $len - 1; $j > $k; $j--) {//比较if ($arr[$j] < $arr[$j - 1]) {//交换$temp = $arr[$j];$arr[$j] = $arr[$j - 1];$arr[$j - 1] = $temp;}}}return $arr;}// 先定义一个数组
$arr = ['9', '2', '4', '1', '7', '3', '5', '8'];
$fun = bubble($arr);
var_dump($fun);
插入排序算法
插入排序的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在一排序序列中从后向前扫描,找到相应的位置并插入。
/*** @param $arr* @return mixed** 插入排序算法的原理如下:* 1.从第一个元素开始,该元素可以认为已经被排序。* 2.取出下一个元素,在已经排序的元素序列中从后向前扫描。* 3.如果该元素(已排序)大于新元素,将该元素移到下一个位置。* 4.重复步骤 ③,直到找打已排序的元素小于或者等于新元素的位置。* 5.将新元素插入到该位置中。* 6.重复步骤2*/
function insert_sort($arr){$len=count($arr);for($i=1; $i<$len; $i++) {//获得当前需要比较的元素值。$tmp = $arr[$i];//内层循环控制 比较 并 插入for($j=$i-1; $j>=0; $j--) {//$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素if($tmp < $arr[$j]) {//发现插入的元素要小,交换位置//将后边的元素与前面的元素互换$arr[$j+1] = $arr[$j];//将前面的数设置为 当前需要交换的数$arr[$j] = $tmp;} else {//如果碰到不需要移动的元素//由于是已经排序好是数组,则前面的就不需要再次比较了。break;}}}//将这个元素 插入到已经排序好的序列内。//返回return $arr;}$arr=array(1,43,54,62,21,66,32,78,36,76,39);
print_r(insert_sort($arr));
选择排序算法
选择排序是一种简单直观的排序算法。它的工作原理如下:首先是在末排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从 剩余未排序元素中继续寻找最小元素。然后放到排序序列末尾。以此类推,直到所有元素均排序完成。
/*** @param $arr* @return mixed** 选择排序算法的原理如下(比冒泡效率高):* 1.外层决定循环层数* 2.选择排序就是默认当前值为最小值,记录下标,然后进行循环比较,记录最小(最大)值的下标,最后交换两者的值。这样第一个值就是最小(最大)值。* 3.然后,依次,循环下去。最后得到的就是有序的数组*/
function select_sort($arr) {//$i 当前最小值的位置, 需要参与比较的元素for($i=0, $len=count($arr); $i<$len-1; $i++) {//先假设最小的值的位置$p = $i;//$j 当前都需要和哪些元素比较,$i 后边的。for($j=$i+1; $j<$len; $j++) {//$arr[$p] 是 当前已知的最小值if($arr[$p] > $arr[$j]) {//比较,发现更小的,记录下最小值的位置;并且在下次比较时,应该采用已知的最小值进行比较。$p = $j;}}//已经确定了当前的最小值的位置,保存到$p中。//如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可if($p != $i) {$tmp = $arr[$p];$arr[$p] = $arr[$i];$arr[$i] = $tmp;}}//返回最终结果return $arr;
}$arr=array(1,43,54,62,21,66,32,78,36,76,39);
print_r(select_sort($arr));
快速排序算法
快速排序是由东尼·霍尔发展的一种排序算法。在平均状况下 ,排序n个项目要O(n log n)次比较。
/*** @param $arr* @return array** 快速排序算法原理如下:* 1.通过设置一个初始中间值,来将需要排序的数组分成3部分:小于中间值的左边,中间值,大于中间值的右边* 2.继续递归用相同的方式来排序左边和右边* 3.最后合并数组*/function quick_sort($arr) { //先判断是否需要继续进行 $length = count($arr); if($length <= 1) { return $arr; } //如果没有返回,说明数组内的元素个数 多余1个,需要排序 //选择一个标尺 //选择第一个元素 $base_num = $arr[0]; //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内 //初始化两个数组 $left_array = array();//小于标尺的 $right_array = array();//大于标尺的 for($i=1; $i<$length; $i++) { if($base_num > $arr[$i]) { //放入左边数组 $left_array[] = $arr[$i]; } else { //放入右边 $right_array[] = $arr[$i]; } } //再分别对 左边 和 右边的数组进行相同的排序处理方式 //递归调用这个函数,并记录结果 $left_array = quick_sort($left_array); $right_array = quick_sort($right_array); //合并左边 标尺 右边 return array_merge($left_array, array($base_num), $right_array);
}
$arr = array(1,98,5,34,23,87,54,23,12,0,456,123,45);
$res = quick_sort($arr);
print_r($res);die;