PHP中常见的四种算法

分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。 15,33,5,89,6,4php

1.冒泡排序

原理分析:算法

  • 比较相邻的元素。若是第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素做一样的工做,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  • 针对全部的元素重复以上的步骤,除了最后一个。
  • 持续每次对愈来愈少的元素重复上面的步骤,直到没有任何一对数字须要比较。

代码实现:数组

<?php /** * Created by PhpStorm. * User: admin * Date: 2017/10/30 * Time: 16:23 */ $arr = [15,33,5,89,6,4]; function bubbleSort($arr) { $count = count($arr); //该层循环控制 须要冒泡的轮数 for ($i=0; $i<$count; $i++) { //该层循环用来控制每轮 冒出一个数 须要比较的次数 for ($k=0; $k<$count-$i-1; $k++){ if($arr[$k]>$arr[$k+1]) { $tmp = $arr[$k+1]; $arr[$k+1] = $arr[$k]; $arr[$k] = $tmp; } } } return $arr; } var_dump(bubbleSort($arr));

最后结果:ui

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

2.快速排序法

原理分析:spa

  • 经过一趟排序将要排序的数据分割成独立的两部分,其中一部分的全部数据都比另一部分的全部数据都要小,而后再按此方法对这两部分数据分别进行快速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列。

代码实现:code

<?php /** * Created by PhpStorm. * User: admin * Date: 2017/10/30 * Time: 17:26 */ $arr = [15,33,5,89,6,4]; function quickSort($arr){ //判断是否是还有进行 if (count($arr)>1){ //指定基准 $k = $arr[0]; //设置左边数组 $x = []; //设置右边数组 $y = []; for ($i=1; $i<count($arr); $i++) { //进行判断 if ($k>$arr[$i]){ $x[] = $arr[$i]; }else{ $y[] = $arr[$i]; } } //递归执行 $x = quickSort($x); $y = quickSort($y); //合并数组 return array_merge($x,array($k),$y); }else { return $arr; } } var_dump(quickSort($arr));

最后结果:orm

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

3.选择排序法

原理分析:排序

  • 在数组中,选出最小的一个数与第一个位置的数交换。而后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

代码实现:递归

<?php /** * Created by PhpStorm. * User: admin * Date: 2017/10/30 * Time: 18:10 */ $arr = [15,33,5,89,6,4]; function selectSort($arr) { $count = count($arr); for($i=0; $i<$count-1; $i++) { //先假设最小的值的位置 $p = $i; for($j=$i+1; $j<$count; $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; } var_dump(selectSort($arr));

最后结果:io

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

4.插入排序法

原理分析:

  • 每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到所有插入完为止。

代码实现:

<?php /** * Created by PhpStorm. * User: admin * Date: 2017/10/30 * Time: 18:20 */ $arr = [15,33,5,89,6,4]; function insertSort($arr) { $count = count($arr); for($i=1; $i<$count; $i++){ $tmp = $arr[$i]; //内层循环控制,比较并插入 for($j=$i-1;$j>=0;$j--) { if($tmp < $arr[$j]) { //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换 $arr[$j+1] = $arr[$j]; $arr[$j] = $tmp; } else { //若是碰到不须要移动的元素,因为是已经排序好是数组,则前面的就不须要再次比较了。 break; } } } return $arr; } var_dump(insertSort($arr));

最后结果:

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

算法是一门高深的学问 :)

相关文章
相关标签/搜索