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 相关文章推荐
PHP5.3.1 不再支持ISAPI
Jan 08 PHP
如何在symfony中导出为CSV文件中的数据
Oct 06 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
php输入流php://input使用浅析
Sep 02 PHP
PHP使用memcache缓存技术提高响应速度的方法
Dec 26 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
Sep 29 PHP
Json_encode防止汉字转义成unicode的方法
Feb 25 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
Mar 21 PHP
laravel实现简单用户权限的示例代码
May 28 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
PHP反射基础知识回顾
Sep 10 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的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
Node.js爬虫如何获取天气和每日问候详解
2019/08/26 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
python构建深度神经网络(续)
2018/03/10 Python
python命令行参数用法实例分析
2019/06/25 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
python实现复制文件到指定目录
2019/10/16 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
社区反邪教工作方案
2014/06/16 职场文书
公司委托书怎么写
2014/08/02 职场文书
2015年幼师工作总结
2015/04/28 职场文书
队名及霸气口号大全
2015/12/25 职场文书