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获取远程图片并把它保存到本地的代码
Apr 07 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
Jun 11 PHP
php线性表顺序存储实现代码(增删查改)
Feb 16 PHP
php命名空间学习详解
Feb 27 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
php获取数组元素中头一个数组元素值的实现方法
Dec 20 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
Mar 16 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 PHP
深入学习微信网址链接解封的防封原理visit_type
Aug 15 PHP
PHP 模拟登陆功能实例详解
Sep 10 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
Oct 04 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/01/09 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
通过DOM脚本去设置样式信息
2010/09/19 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
深入理解JavaScript中的对象复制(Object Clone)
2016/05/18 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
canvas时钟效果
2017/02/16 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
JavaScript创建对象的七种方式全面总结
2017/08/21 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
js实现扫雷源代码
2020/11/27 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
院领导写的就业推荐信
2014/03/09 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
计算机实训心得体会
2016/01/14 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android