侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

7种php基本排序实现方法

php  /  管理员 发布于 7年前   368

本文总结了一下常用的7种排序方法,并用php语言实现。

1、直接插入排序

/* *  直接插入排序,插入排序的思想是:当前插入位置之前的元素有序, *  若插入当前位置的元素比有序元素最后一个元素大,则什么也不做, *  否则在有序序列中找到插入的位置,并插入 */function insertSort($arr) {  $len = count($arr);    for($i = 1; $i < $len; $i++) {    if($arr[$i-1] > $arr[i]) {      for($j = $i - 1;$j >= 0; $j-- ) {        $tmp = $arr[$j+1];        if($tmp < $arr[$j]) {          $arr[$j+1] = $arr[$j];          $arr[$j] = $tmp;        }else{          break;        }    }      }  }    return $arr;}

2、冒泡排序

/*  冒泡排序,冒泡排序思想:进行 n-1 趟冒泡排序, 每趟两两比较调整最大值到数组(子数组)末尾*/function bubbleSort($arr) {  $len = count($arr);  for($i = 1; $i < $len; $i++) {    for($j = 0; $j < $len-$i; $j++) {      if($arr[$j] > $arr[$j+1]) {        $tmp = $arr[$j+1];        $arr[$j+1] = $arr[$j];        $arr[$j] = $tmp;      }    }  }  return $arr;}

3、简单选择排序

/*  简单选择排序, 简单排序思想:从数组第一个元素开始依次确定从小到大的元素*/function selectSort($arr) {  $len = count($arr);  for($i = 0; $i < $len; $i++) {    $k = $i;    for($j = $i+1; $j < $len; $j++) {      if($arr[$k] > $arr[$j]) {        $k = $j;      }    }    if($k != $i) {      $tmp = $arr[$i];      $arr[$i] = $arr[$k];      $arr[$k] = $tmp;    }  }  return $arr;}

4、希尔排序

/*  希尔排序,希尔排序原理:将数组按指定步长分隔成若干子序列,然后分别对子序列进行排序(在这是直接)*/function shellSort($arr) {  $len = count($arr);  $k = floor($len/2);  while($k > 0) {    for($i = 0; $i < $k; $i++) {      for($j = $i; $j < $len, ($j + $k) < $len; $j = $j + $k) {        if($arr[$j] > $arr[$j+$k]) {          $tmp = $arr[$j+$k];          $arr[$j+$k] = $arr[$j];          $arr[$j] = $tmp;        }      }    }    $k = floor($k/2);  }  return $arr;}

5、快速排序

/* *  快速排序,快排思想:通过一趟排序将待排的记录分为两个独立的部分,其中一部分的记录的关键字均不大于 *  另一部分记录的关键字,然后再分别对这两部分记录继续进行快速排序,以达到整个序列有序,具体做法需要 *  每趟排序设置一个标准关键字和分别指向头一个记录的关键字和最后一个记录的关键字的指针。 *  quickSort($arr, 0, count($arr) -1); */function quickSort(&$arr,$low,$high) {  if($low < $high) {    $i = $low;    $j = $high;    $primary = $arr[$low];    while($i < $j) {      while($i < $j && $arr[$j] >= $primary) {        $j--;      }      if($i < $j) {        $arr[$i++] = $arr[$j];      }      while($i < $j && $arr[$i] <= $primary) {        $i++;      }      if($i < $j) {        $arr[$j--] = $arr[$i];      }    }    $arr[$i] = $primary;    quickSort($arr, $low, $i-1);    quickSort($arr, $i+1, $high);  }}

6、堆排序

/*  堆排序*/// 调整子堆的为大根堆的过程,$s为子堆的根的位置,$m为堆最后一个元素位置function heapAdjust(&$arr, $s, $m) {  $tmp = $arr[$s];  // 在调整为大根堆的过程中可能会影响左子堆或右子堆  // for循环的作用是要保证子堆也是大根堆  for($j = 2*$s + 1; $j <= $m; $j = 2*$j + 1) {    // 找到根节点的左右孩子中的最大者,然后用这个最大者与根节点比较,    // 若大则进行调整,否则符合大根堆的 特点跳出循环      if($j < $m && $arr[$j] < $arr[$j+1]) {      $j++;    }    if($tmp >= $arr[$j] ) {      break;    }    $arr[$s] = $arr[$j];    $s = $j;  }  $arr[$s] = $tmp;}// 堆排序function heapSort($arr) {  $len = count($arr);  // 依次从子堆开始调整堆为大根堆  for($i = floor($len/2-1); $i >= 0; $i--) {    heapAdjust($arr, $i, $len-1);  }  // 依次把根节点调换至最后一个位置,再次调整堆为大根堆,找到次最大值,  // 依次类推得到一个有序数组  for($n = $len-1; $n > 0; $n--) {    $tmp = $arr[$n];    $arr[$n] = $arr[0];    $arr[0] = $tmp;    heapAdjust($arr, 0, $n-1);  }  return $arr;}

7、归并排序

/*  归并排序,这里实现的是两路归并*/// 分别将有序的$arr1[s..m]、$arr2[m+1..n]归并为有序的$arr2[s..n]function Merge(&$arr1, &$arr2, $s, $m, $n) {  for($k = $s,$i = $s, $j = $m+1; $i <= $m && $j <= $n; $k++) {    if($arr1[$i]<$arr1[$j]) {      $arr2[$k] = $arr1[$i++];    }else {      $arr2[$k] = $arr1[$j++];    }  }  if($i <= $m) {    for(; $i <= $m; $i++) {      $arr2[$k++] = $arr1[$i];    }  } else if($j <= $n) {    for(; $j <= $n; $j++) {      $arr2[$k++] = $arr1[$j];    }  }}// 递归形式的两路归并function MSort(&$arr1, &$arr2, $s, $t) {  if($s == $t) {    $arr2[$s] = $arr1[$s];  }else {    $m = floor(($s+$t)/2);    $tmp_arr = array();    MSort($arr1, $tmp_arr, $s, $m);    MSort($arr1, $tmp_arr, $m+1, $t);    Merge($tmp_arr, $arr2, $s, $m, $t);  }}// 对一位数组$arr[0..n-1]中的元素进行两路归并function mergeSort($arr) {  $len = count($arr);  MSort($arr, $arr, 0, $len-1);  return $arr;}

使用经验
若排序的记录数目n较小时,可以采用直接插入排序和简单选择排序,当记录本身信息量较大时,用简单选择排序方法较好。
若待排序记录按关键字基本有序,适合采用直接插入排序和冒泡排序。
若n值较大时,可以采用快速排序、堆排序和归并排序。另外快速排序被认为是内部排序方法中最好的方法。

以上就是本文的全部内容,希望对大家的学习有所帮助。

您可能感兴趣的文章:

  • PHP 数组排序方法总结 推荐收藏
  • PHP 多维数组的排序问题 根据二维数组中某个项排序
  • PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
  • php二维数组排序详解
  • php二维数组排序方法(array_multisort usort)
  • php实现快速排序的三种方法分享
  • PHP二维数组排序的3种方法和自定义函数分享
  • php数组中包含中文的排序方法
  • PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
  • php中多维数组按指定value排序的实现代码


  • 上一条:
    详解PHP实现异步调用的4种方法
    下一条:
    php实现图片上传并利用ImageMagick生成缩略图
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客