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 相关文章推荐
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
Aug 12 PHP
深入解析phpCB批量转换的代码示例
Jun 27 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
php中自定义函数dump查看数组信息类似var_dump
Jan 27 PHP
php的zip解压缩类pclzip使用示例
Mar 14 PHP
php实现保存submit内容之后禁止刷新
Mar 19 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
yii中widget的用法
Dec 03 PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
Apr 20 PHP
thinkPHP和onethink微信支付插件分享
Aug 11 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
德劲1103二次变频版的打磨
2021/03/02 无线电
php缓存技术介绍
2006/11/25 PHP
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
详解React中setState回调函数
2018/06/14 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
python获取各操作系统硬件信息的方法
2015/06/03 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Django REST framework内置路由用法
2019/07/26 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
python 深度学习中的4种激活函数
2020/09/18 Python
Python对excel的基本操作方法
2021/02/18 Python
"引用"与多态的关系
2013/02/01 面试题
幼儿园园长自我鉴定
2013/10/22 职场文书
药品质量检测应届生求职信
2013/11/14 职场文书
项目副经理岗位职责
2013/12/30 职场文书
国际商务专业求职信
2014/07/15 职场文书
节能环保演讲稿
2014/08/28 职场文书
教师岗位职责范本
2015/04/02 职场文书
辞职信格式范文
2015/05/13 职场文书
react如何快速设置文件路径别名
2021/04/28 Javascript
如何利用golang运用mysql数据库
2022/03/13 Golang