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中在数据库中保存Checkbox数据(2)
Oct 09 PHP
PHP生成便于打印的网页
Oct 09 PHP
PHP 源代码压缩小工具
Dec 22 PHP
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
深入php数据采集的详解
Jun 02 PHP
PHP页面间参数传递的四种方法详解
Jun 09 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
php的SimpleXML方法读写XML接口文件实例解析
Jun 16 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
详解PHP中的Traits
Jul 29 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
PHP实现伪静态方法汇总
Jan 13 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颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
使javascript也能包含文件
2006/10/26 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
2017/02/07 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
2017/02/12 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
优秀英语专业毕业生求职信
2013/11/23 职场文书
二年级语文教学反思
2014/02/02 职场文书
产品质量承诺书
2014/03/27 职场文书
2014年教育工作总结
2014/11/26 职场文书
2014企业年终工作总结
2014/12/23 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
听证会主持词
2015/07/03 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis