PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析


Posted in PHP onApril 20, 2018

本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort)。分享给大家供大家参考,具体如下:

算法引入:

在这里我们依然使用《大话数据结构》里面的一个例子:

扑克牌是我们几乎每个人都玩过的游戏。平时我们开始的时候一般都是一个人发牌,其他人都是一边摸牌,一边理牌,假如你摸上的第一张牌是 5,第二张牌是 3,自然而然的我们把 3 插到 5 的前面;第三张牌是 4,查到 3 和 5 的中间;第四张牌是 6,放到 5 的后面;第五张牌是 2,插到 3 的前面;……。最后当我们摸完所有的牌时,手上的牌都是从小到大(点数)排好序的。

我们来看这个顺序:

5               3           // 将 3 插入只有一个元素 5 的有序表中
3 5             4           // 将 4 插入有两个元素 3 5 的有序表中
3 4 5           6           // 将 6 插入有两个元素 3 4 5 的有序表中
3 4 5 6         2           // 将 2 插入有两个元素 3 4 5 6 的有序表中
2 3 4 5 6

基本思想:

直接插入排序的基本思想是 : 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。

第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。

插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。

算法实现:

<?php
//直接插入排序
function swap(array &$arr,$a,$b){
  $temp = $arr[$a];
  $arr[$a] = $arr[$b];
  $arr[$b] = $temp;
}
function InsertSort(array &$arr){
  $count = count($arr);
  //数组中第一个元素作为一个已经存在的有序表
  for($i = 1;$i < $count;$i ++){
    $temp = $arr[$i];   //设置哨兵
    for($j = $i - 1;$j >= 0 && $arr[$j] > $temp;$j --){
      $arr[$j + 1] = $arr[$j];    //记录后移
    }
    $arr[$j + 1] = $temp;   //插入到正确的位置
  }
}
$arr = array(9,1,5,8,3,7,4,6,2);
InsertSort($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)
}

直接插入排序算法的时间复杂度为 O(n^2)

直接插入排序是稳定排序。

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

PHP 相关文章推荐
一些常用的php简单命令代码集锦
Sep 24 PHP
php header Content-Type类型小结
Jul 03 PHP
PHP include_path设置技巧分享
Jul 03 PHP
深入分析php中接口与抽象类的区别
Jun 08 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
Jun 17 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
thinkPHP的表达式查询用法详解
Sep 14 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
实例解析php的数据类型
Oct 24 PHP
Yii redis集合的基本使用教程
Jun 14 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
Apr 20 #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
You might like
php实现水仙花数示例分享
2014/04/03 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
【消息提示组件】,兼容IE6/7&amp;&amp;FF2
2007/09/04 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
如何快速上手Vuex
2017/02/14 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
pytorch常见的Tensor类型详解
2020/01/15 Python
用Python开发app后端有优势吗
2020/06/29 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
中学生学习生活的自我评价
2013/10/26 职场文书
客服工作职责
2013/12/11 职场文书
5.1手机促销活动
2014/01/17 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
商家认证委托书格式
2014/10/16 职场文书
校本研修个人总结
2015/02/28 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL