许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣。作为一个初级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;