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 相关文章推荐
DEDE采集大师官方留后门的删除办法
Jan 08 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
Jun 06 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
PHP中使用smarty生成静态文件的例子
Apr 24 PHP
ThinkPHP3.1基础知识快速入门
Jun 19 PHP
php中数字、字符与对象判断函数用法实例
Nov 26 PHP
PHP也能干大事 随机函数
Apr 14 PHP
Apache无法自动跳转却显示目录的解决方法
Nov 30 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
PHP addcslashes()函数讲解
Feb 03 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
Oct 08 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 mysql数据库操作分页类
2008/06/04 PHP
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
php中常用的预定义变量小结
2012/05/09 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
javascript去除空格方法小结
2015/05/21 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
Python提取网页中超链接的方法
2016/09/18 Python
详解使用python crontab设置linux定时任务
2016/12/08 Python
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
opencv3/C++ 平面对象识别&amp;透视变换方式
2019/12/11 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
西门豹教学反思
2014/02/04 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
平安建设实施方案
2014/03/19 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
我的中国梦口号
2014/06/16 职场文书
社会工作专业求职信
2014/07/15 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
辩论会主持词
2015/07/03 职场文书
文明上网主题班会
2015/08/14 职场文书