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发送有附件的电子邮件-(PHPMailer使用的实例分析)
Apr 26 PHP
浅析php中三个等号(===)和两个等号(==)的区别
Aug 06 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
php创建sprite
Feb 11 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
PHP实现生成唯一编号(36进制的不重复编号)
Jul 01 PHP
深入浅析PHP7.0新特征(五大新特征)
Oct 29 PHP
PHP使用token防止表单重复提交的方法
Apr 07 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
浅谈php中curl、fsockopen的应用
Dec 10 PHP
php中照片旋转 (orientation) 问题的正确处理
Feb 16 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/11/25 PHP
一些使用频率比较高的php函数
2008/10/03 PHP
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
学习ExtJS Column布局
2009/10/08 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
js选项卡的制作方法
2017/01/23 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
Python中is和==的区别详解
2018/11/15 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
html5读取本地文件示例代码
2014/04/22 HTML / CSS
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
如何获取某个日期是当月的最后一天
2013/12/05 面试题
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
音乐学专业求职信
2014/07/22 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
判断Python中的Nonetype类型
2021/05/25 Python
基于flask实现五子棋小游戏
2021/05/25 Python