排序算法
最近学习了几种排序算法 比较low 不喜勿喷,欢迎大家指正,也期待能够与更多的朋友一起交流学习。
1 //冒泡排序 2 public static function getSort($arr=array()){ 3 //var_dump($arr); 4 //echo "</br>"; 5 $num = count($arr);//计算数组长度、即排序的循环次数 6 //双层循环 7 for($i=1;$i<$num;$i++){ 8 for($j=0;$j<$num-$i;$j++){ 9 if($arr[$j] < $arr[$j+1]){ 10 list($arr[$j],$arr[$j+1]) = [$arr[$j+1],$arr[$j]];
13 } 14 } 15 } 16 return $arr; 17 } 18 19 //快速排序 QuickSort 20 /*是对冒泡排序的一种改进。 21 *快速排序它的基本思想是: 22 *通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 23 *然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 24 */ 25 public static function QuickSort($arr=[]){ 26 //先判断是否需要继续进行 27 $length = count($arr); 28 if($length <= 1) { 29 return $arr; 30 } 31 //如果没有返回,说明数组内的元素个数 多余1个,需要排序 32 //选取第一个元素作为一个标尺 33 $base_num = $arr[0]; 34 //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内 35 //初始化两个数组 36 $left_array = array();//小于标尺的 37 $right_array = array();//大于标尺的 38 for($i=1; $i<$length; $i++) { 39 if($base_num > $arr[$i]) { 40 //放入左边数组 41 $left_array[] = $arr[$i]; 42 } else { 43 //放入右边 44 $right_array[] = $arr[$i]; 45 } 46 } 47 //再分别对 左边 和 右边的数组进行相同的排序处理方式 48 //递归调用这个函数,并记录结果 49 $left_array = self::QuickSort($left_array); 50 $right_array = self::QuickSort($right_array); 51 //合并左边 标尺 右边 52 return array_merge($left_array, array($base_num), $right_array); 53 } 54 55 /* 56 * 选择排序(Selection sort)是一种简单直观的排序算法。 57 * 它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素, 58 * 存放在序列的起始位置,直到全部待排序的数据元素排完。 59 */ 60 public static function SelectSort($arr){ 61 //实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数 62 //$i 当前最小值的位置, 需要参与比较的元素 63 for($i=0, $len=count($arr); $i<$len-1; $i++) { 64 //先假设最小的值的位置 65 $p = $i; 66 //$j 当前都需要和哪些元素比较,$i 后边的。 67 for($j=$i+1; $j<$len; $j++) { 68 //$arr[$p] 是 当前已知的最小值 69 if($arr[$p] > $arr[$j]) { 70 //比较,发现更小的,记录下最小值的位置;并且在下次比较时, 71 // 应该采用已知的最小值进行比较。 72 $p = $j; 73 } 74 } 75 //已经确定了当前的最小值的位置,保存到$p中。 76 //如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可 77 if($p != $i) { 78 $tmp = $arr[$p]; 79 $arr[$p] = $arr[$i]; 80 $arr[$i] = $tmp; 81 } 82 } 83 //返回最终结果 84 return $arr; 85 } 86 87 /* 插入排序: 88 * 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数, 89 * 但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法, 90 * 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据, 91 * 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。 92 * 插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素, 93 * 但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。 94 * 在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。 95 */ 96 public static function InsertSort($arr) { 97 //区分 哪部分是已经排序好的 98 //哪部分是没有排序的 99 //找到其中一个需要排序的元素 100 //这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素 101 //利用循环就可以标志出来 102 //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了, 103 //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列 104 for($i=1, $len=count($arr); $i<$len; $i++) { 105 //获得当前需要比较的元素值。 106 $tmp = $arr[$i]; 107 //内层循环控制 比较 并 插入 108 for($j=$i-1;$j>=0;$j--) { 109 //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素 110 if($tmp < $arr[$j]) { 111 //发现插入的元素要小,交换位置 112 //将后边的元素与前面的元素互换 113 $arr[$j+1] = $arr[$j]; 114 //将前面的数设置为 当前需要交换的数 115 $arr[$j] = $tmp; 116 } else { 117 //如果碰到不需要移动的元素 118 //由于是已经排序好是数组,则前面的就不需要再次比较了 119 break; 120 } 121 } 122 } 123 //将这个元素 插入到已经排序好的序列内 124 return $arr; 125 }

浙公网安备 33010602011771号