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 之入门篇
Dec 04 PHP
PHP+MYSQL 出现乱码的解决方法
Aug 08 PHP
PHP编实现程动态图像的创建代码
Sep 28 PHP
php 动态多文件上传
Jan 18 PHP
PHP 冒泡排序算法的实现代码
Aug 08 PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
php中hashtable实现示例分享
Feb 13 PHP
基于php的CMS中展示文章类实例分析
Jun 18 PHP
PHP中的表达式简述
May 29 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
PHP智能识别收货地址信息实例
Jan 05 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生成自己的LOG文件
2006/10/09 PHP
PHP+MYSQL的文章管理系统(一)
2006/10/09 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
php防止站外远程提交表单的方法
2014/10/20 PHP
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
PHP7 其他修改
2021/03/09 PHP
javascript特殊用法示例介绍
2013/11/29 Javascript
jQuery实现新消息在网页标题闪烁提示
2015/06/23 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
Python实现控制台中的进度条功能代码
2017/12/22 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
python list转置和前后反转的例子
2019/08/26 Python
python 循环数据赋值实例
2019/12/02 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
django使用多个数据库的方法实例
2021/03/04 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
巴基斯坦购物网站:Goto
2019/03/11 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
初入社会应届生求职信
2013/11/18 职场文书
电子商务专业学生的自我鉴定
2013/11/28 职场文书
社会发展项目建议书
2014/08/25 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
政风行风整改报告
2014/11/06 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
Go中的条件语句Switch示例详解
2021/08/23 Golang
为Centos安装指定版本的Docker
2022/04/01 Servers