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文件上传实例详解!!!
Jan 02 PHP
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
PHP 网络开发详解之远程文件包含漏洞
Apr 25 PHP
PHP禁止页面缓存的代码
Oct 23 PHP
简单实现限定phpmyadmin访问ip的方法
Mar 05 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
Aug 07 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
mac系统下为 php 添加 pcntl 扩展
Aug 28 PHP
PHP实现大数(浮点数)取余的方法
Feb 18 PHP
PHP+jQuery实现双击修改table表格功能示例
Feb 21 PHP
Laravel5.7 数据库操作迁移的实现方法
Apr 12 PHP
php进行md5加密简单实例方法
Sep 19 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之第七天
2006/10/09 PHP
php&amp;java(三)
2006/10/09 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
Laravel实现表单提交
2017/05/07 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
Javascript点击按钮随机改变数字与其颜色
2016/09/01 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
react项目实践之webpack-dev-serve
2018/09/14 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
django迁移文件migrations的实现
2020/03/31 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
恶意软件的定义
2014/11/12 面试题
绿化工程实施方案
2014/03/17 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技