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 相关文章推荐
用文本作数据处理
Oct 09 PHP
PHP strtotime函数详解
Dec 18 PHP
php下保存远程图片到本地的办法
Aug 08 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 PHP
php去掉URL网址中带有PHPSESSID的配置方法
Jul 08 PHP
php实现的替换敏感字符串类实例
Sep 22 PHP
php基于表单密码验证与HTTP验证用法实例
Jan 06 PHP
PHP实现在线阅读PDF文件的方法
Jun 23 PHP
纯PHP代码实现支付宝批量付款
Dec 24 PHP
PHP自定义多进制的方法
Nov 03 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
Oct 17 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
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
PHP levenshtein()函数用法讲解
2019/03/08 PHP
超清晰的document对象详解
2007/02/27 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
基于jQuery的星级评分插件
2011/08/12 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
JS重载实现方法分析
2016/12/16 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
利用vue.js实现被选中状态的改变方法
2018/02/08 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
flask-restful使用总结
2018/12/04 Python
Python实现分段线性插值
2018/12/17 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
解决Python中回文数和质数的问题
2019/11/24 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
美国美妆网站:B-Glowing
2016/10/12 全球购物
离职报告格式
2014/11/04 职场文书
超市食品安全承诺书
2015/04/29 职场文书
Python趣味挑战之教你用pygame画进度条
2021/05/31 Python
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android