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 相关文章推荐
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
Apr 12 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
PHP中的str_repeat函数在JavaScript中的实现
Sep 16 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
Dec 05 PHP
php微信支付之APP支付方法
Mar 04 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
Oct 29 PHP
Laravel5.4简单实现app接口Api Token认证方法
Aug 29 PHP
如何解决PHP获取不到SESSION信息之一般情况
Oct 10 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
Dec 12 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删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
orm获取关联表里的属性值
2016/04/17 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
Python的装饰器使用详解
2017/06/26 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
python http基本验证方法
2018/12/26 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
2020/03/12 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
质检部岗位职责
2013/11/11 职场文书
2013的个人自我评价
2013/12/26 职场文书
人事助理自荐信
2014/02/02 职场文书
《老山界》教学反思
2014/04/08 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书