PHP排序算法之简单选择排序(Simple Selection Sort)实例分析


Posted in PHP onApril 20, 2018

本文实例讲述了PHP排序算法之简单选择排序(Simple Selection Sort)。分享给大家供大家参考,具体如下:

基本思想:

通过 n - i 次关键字间的比较,从 n - i + 1 个记录中选出关键字最小的记录,并和第 i (1 <= i <= n) 个记录交换,执行n-1趟 后就完成了记录序列的排序。

算法实现:

<?php
//简单选择排序
//交换函数
function swap(array &$arr,$a,$b){
  $temp = $arr[$a];
  $arr[$a] = $arr[$b];
  $arr[$b] = $temp;
}
//简单选择排序算法
function SelectSort(array &$arr){
  $count = count($arr);
  for($i = 0;$i < $count - 1;$i ++){
    //记录第$i个元素后的所有元素最小值下标
    $min = $i;
    for($j = $i + 1;$j < $count;$j ++){
      if($arr[$j] < $arr[$min]){
        $min = $j;
      }
    }
    if($min != $i){
      swap($arr,$min,$i);
    }
  }
}
$arr = array(9,1,5,8,3,7,4,6,2);
SelectSort($arr);
var_dump($arr);

运行结果:

array(9) {
 [0]=>
 int(1)
 [1]=>
 int(2)
 [2]=>
 int(3)
 [3]=>
 int(4)
 [4]=>
 int(5)
 [5]=>
 int(6)
 [6]=>
 int(7)
 [7]=>
 int(8)
 [8]=>
 int(9)
}

复杂度分析:

在简单选择排序过程中,所需移动记录的次数比较少。最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录。

最坏情况下,即待排序记录初始状态是按第一条记录最大,之后的记录从小到大顺序排列,则需要移动记录的次数最多为3(n-1)。简单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。当i=1时,需进行n-1次比较;当i=2时,需进行n-2次比较;依次类推,共需要进行的比较次数是(n-1)+(n-2)+…+2+1=n(n-1)/2,即进行比较操作的时间复杂度为O(n^2),进行移动操作的时间复杂度为O(n)

简单选择排序是不稳定排序。

本文参考自《大话数据结构》,在此仅作记录,方便以后查阅,大神勿喷!

PHP 相关文章推荐
PHP脚本数据库功能详解(中)
Oct 09 PHP
一个图形显示IP的PHP程序代码
Oct 19 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
Apr 25 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
Jun 23 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
twig里使用js变量的方法
Feb 05 PHP
php mysql操作mysql_connect连接数据库实例详解
Dec 26 PHP
PHP实现用户登录的案例代码
May 10 PHP
PHP PDOStatement::execute讲解
Jan 31 PHP
laravel 事件/监听器实例代码
Apr 12 PHP
对laravel的session获取与存取方法详解
Oct 08 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 #PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
Apr 20 #PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 #PHP
Laravel 加载第三方类库的方法
Apr 20 #PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 #PHP
详解php curl带有csrf-token验证模拟提交方法
Apr 18 #PHP
php-app开发接口加密详解
Apr 18 #PHP
You might like
PHP 采集心得技巧
2009/05/15 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
javascript中关于执行环境的杂谈
2011/08/14 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
vue 中url 链接左边的小图标更改问题
2019/12/30 Javascript
python根据出生日期返回年龄的方法
2015/03/26 Python
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
python实现基本进制转换的方法
2015/07/11 Python
Python实现简单登录验证
2016/04/13 Python
python中验证码连通域分割的方法详解
2018/06/04 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
python区块及区块链的开发详解
2019/07/03 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
常用的HTML5列表标签
2017/06/20 HTML / CSS
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
大学生写自荐信的技巧
2014/01/08 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
法律意见书范文
2015/06/04 职场文书
Golang 并发下的问题定位及解决方案
2022/03/16 Golang
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技