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简单静态页生成过程
Mar 27 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
浅析php面向对象public private protected 访问修饰符
Jun 30 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
Nov 14 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
Oct 20 PHP
浅谈php优化需要注意的地方
Nov 27 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 PHP
mac系统下安装多个php并自由切换的方法详解
Apr 21 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/07/19 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
js同时按下两个方向键
2007/12/01 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
js 实现菜单上下显示附效果图
2013/11/21 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
python的keyword模块用法实例分析
2015/06/30 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
荷兰超市:DEEN
2018/03/14 全球购物
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
珍珠奶茶店创业计划书
2014/01/11 职场文书
美术毕业生求职信
2014/02/25 职场文书
境外导游求职信
2014/02/27 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
校园绿化美化方案
2014/06/08 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
自书遗嘱范文
2015/08/07 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python
php实例化对象的实例方法
2021/11/17 PHP