QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

泡泡马甲APP 更多内容请下载泡泡马甲手机客户端APP 立即下载 ×
查看: 114|回复: 0

[PHP] 实现常见的排序算法

[复制链接]

等级头衔

积分成就    金币 : 2804
   泡泡 : 1516
   精华 : 6
   在线时间 : 1243 小时
   最后登录 : 2024-5-2

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2023-7-28 10:19:23 | 显示全部楼层 |阅读模式
在工作中我们经常使用MySQL的order by方法对数据进行排序,但是还是有很多开发场景无法通过MySQL排序获取数据,需要我们自己动手开发,今天我们就针对四个常见的排序算法进行讲解一下。
4 c  Z0 ^$ x2 {  e1. 冒泡排序
7 `# T* `* |! r6 l  d7 C7 X这个应该是大家最为熟悉的排序了,实现也比较简单。我们通过两两相比,每循环一轮就获得这一轮中最大或最小的值。
9 X/ z* _; o% i
  1. <?php
  2. //冒泡排序,降序
  3. function maopaoSort(array $data)
  4. {
  5.     $len = count($data);
  6.     for ($i=0;$i<$len;$i++){
  7.         for ($j=0;$j<$len-$i-1;$j++){
  8.             if($data[$j]<$data[$j+1]){
  9.                 $tem = $data[$j];
  10.                 $data[$j] = $data[$j+1];
  11.                 $data[$j+1] = $tem;
  12.             }
  13.         }
  14.     }
  15.     return $data;
  16. }
  17. print_r(maopaoSort([0,435,123,54323,54621,543,321,56,231,54,455,977]));
注意:第二层的循环中 $j 最大值是 数组的长度 - 1 - 以循环的次数($i)
" O6 s$ m5 s/ J9 a7 b2. 选择排序
$ t! k# h0 L0 p$ P2 n9 ^! H; ]选择一个值作为对比对象,再用其他值与对比对象进行比较,然后根据对比结果调换位置,循环一遍数据后就可以得到想要的结果了。
; y% E$ ?' Y. O% g' `" n
  1. <?php
  2. //选择排序,降序
  3. function selectSort(array $data)
  4. {
  5.     $len = count($data);
  6.     for ($i=0;$i<$len;$i++){
  7.         $selectVal = $data[$i];
  8.         $selectKey = $i;
  9.         for ($j=$i+1;$j<$len;$j++){
  10.             //如果想要升序,只需要把【<】改为【>】即可
  11.             if($selectVal>$data[$j]){
  12.                 $selectVal = $data[$j];
  13.                 $selectKey = $j;
  14.             }
  15.         }
  16.         $tem = $data[$i];
  17.         $data[$i] = $selectVal;
  18.         $data[$selectKey] = $tem;
  19.     }
  20.     return $data;
  21. }
  22. print_r(selectSort([0,435,123,54323,54621,543,321,56,231,54,455,977]));
3. 快速排序
( r% A( b# i* L% {2 l6 l$ X% E选择一个比较值,将数组的值跟选择的值进行比较,将数组拆分成左右两组数据。
' W6 g' r  L! e, P+ }$ q+ k
  1. <?php
  2. //快速排序,降序
  3. function fastSort(array $data)
  4. {
  5.     $len = count($data);
  6.     //如果数组中只有一个元素,直接返回
  7.     if($len<=1) return $data;
  8.     //选择一个元素作为比较对象
  9.     $base = $data[0];
  10.     $leftData = array();
  11.     $rightData = array();
  12.     for ($i=1;$i<$len;$i++){
  13.         //降序时左边的存储比较大的值,如果想要升序,左边的数组存储比较小的值
  14.         if($base<$data[$i]){
  15.             $leftData[] = $data[$i];
  16.         }else{
  17.             $rightData[] = $data[$i];
  18.         }
  19.     }
  20.     //使用递归再次处理左右两边的数组
  21.     $leftData = fastSort($leftData);
  22.     $rightData = fastSort($rightData);
  23.     //注意顺序,一定是$leftData为第一个参数,$rightData为第三个参数
  24.     return array_merge($leftData,[$base],$rightData);
  25. }
4. 插入排序& B; O, N/ V; g3 I
其工作原理:首先我们假设前面的数据都是已经排好的数据,现在我们把第N个数据插入到有序里。3 g6 M) ]" _6 t' A
  1. <?php
  2. //插入排序,降序
  3. function insertSort(array $data)
  4. {
  5.     $len = count($data);
  6.     for ($i=1;$i<$len;$i++){
  7.         $tmp = $data[$i];
  8.         for ($j=$i-1; $j>0; $j--){
  9.             //如果想要升序,只需要把【<】改为【>】即可
  10.             if($data[$j]<$tmp){
  11.                 $data[$j+1] = $data[$j];
  12.                 $data[$j] = $tmp;
  13.             }
  14.         }
  15.     }
  16.     return $data;
  17. }
除了上述的这四种排序外还有希尔排序、堆排序以及归并排序。这几种排序相对较为复杂,有兴趣的可以自己去实现一下。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号 )

GMT+8, 2024-5-4 08:07

Powered by paopaomj X3.4 © 2016-2024 sitemap

快速回复 返回顶部 返回列表