插入排序(Insertion Sort),是一种较稳定、简单直观的排序算法。插入排序的工作原理,是通过构建有序序列,对于未排序的数据,在有序序列中从后向前扫描,找到合适的位置并将其插入。插入排序,在最好情况下,时间复杂度为O(n);在最坏情况下,时间复杂度为O(n2);平均时间复杂度为O(n2)。

插入排序示例图:

PHP实现插入排序算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
/**
 
* 数据结构与算法(PHP实现) - 插入排序(Insertion Sort)。
 
*
 
* @author 创想编程(TOPPHP.ORG)
 
* @copyright Copyright (c) 2013 创想编程(TOPPHP.ORG) All Rights Reserved
 
* @license http://www.opensource.org/licenses/mit-license.php MIT LICENSE
 
* @version 1.0.0 - Build20130613
 
*/
class
InsertionSort {
  
/**
   
* 需要排序的数据数组。
   
*
   
* @var array
   
*/
  
private
$data
;
 
  
/**
   
* 数据数组的长度。
   
*
   
* @var integer
   
*/
  
private
$size
;
 
  
/**
   
* 数据数组是否已排序。
   
*
   
* @var boolean
   
*/
  
private
$done
;
 
  
/**
   
* 构造方法 - 初始化数据。
   
*
   
* @param array $data 需要排序的数据数组。
   
*/
  
public
function
__construct(
array
$data
) {
    
$this
->data =
$data
;
    
$this
->size =
count
(
$this
->data);
    
$this
->done = FALSE;
  
}
 
  
/**
   
* 插入排序。
   
*/
  
private
function
sort() {
    
$this
->done = TRUE;
 
    
for
(
$i
= 1;
$i
<
$this
->size; ++
$i
) {
      
$current
=
$this
->data[
$i
];
 
      
if
(
$current
<
$this
->data[
$i
- 1]) {
        
for
(
$j
=
$i
- 1;
$j
>= 0 &&
$this
->data[
$j
] >
$current
; --
$j
) {
          
$this
->data[
$j
+ 1] =
$this
->data[
$j
];
        
}
 
        
$this
->data[
$j
+ 1] =
$current
;
      
}
    
}
  
}
 
  
/**
   
* 获取排序后的数据数组。
   
*
   
* @return array 返回排序后的数据数组。
   
*/
  
public
function
getResult() {
    
if
(
$this
->done) {
      
return
$this
->data;
    
}
 
    
$this
->sort();
 
    
return
$this
->data;
  
}
}
?>

示例代码
1
2
3
4
<?php
$insertion
=
new
InsertionSort(
array
(9, 1, 5, 3, 2, 8, 6));
echo
'<pre>'
, print_r(
$insertion
->getResult(), TRUE),
'</pre>'
;
?>

PHP实现插入排序算法的更多相关文章

  1. 排序系列 之 折半插入排序算法 —— Java实现

    基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中 ...

  2. 排序系列 之 直接插入排序算法 —— Java实现

    直接插入排序算法 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的 ...

  3. 插入排序---希尔插入排序算法(Javascript版)

    取一个小于n的整数作为第一个增量,把序列分组.所有距离为增量的倍数的元素放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量(第二个<第一个)重复上述的分组和排序,直至所取的增量=1, ...

  4. 插入排序---直接插入排序算法(Javascript版)

    将n个元素的数列分为已有序和无序两个部分. 数列:{a1,a2,a3,a4,…,an} 将该数列的第一元素视为有序数列,后面都视为无序数列: {{a1},{a2,a3,a4,…,an}} 将无序数列中 ...

  5. 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)

    插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...

  6. 《算法4》2.1 - 插入排序算法(Insertion Sort), Python实现

    排序算法列表电梯: 选择排序算法:详见 Selection Sort 插入排序算法(Insertion Sort):非常适用于小数组和部分排序好的数组,是应用比较多的算法.详见本文 插入排序算法的语言 ...

  7. 直接插入排序算法:ArrayList实现和数组实现

    直接插入排序算法思想: 排序区间R[1..n]: 在排序的过程中,整个排序区间被分为两个子区间: 有序区R[ 1 ... i-1 ]和无序区R[ i ... n ]: 共进行n-1趟排序,每趟排序都是 ...

  8. 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法

    注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...

  9. C/C++ -- 插入排序算法

    索引: 目录索引 参看代码 GitHub: Sort.cpp 代码简要分析说明: 1.for(int i=1;i<nSize;i++) 这个外层的for循环, [0][1],[1][2],[2] ...

随机推荐

  1. Android 最火高速开发框架AndroidAnnotations使用具体解释

    Android 最火的高速开发框架androidannotations配置具体解释文章中有eclipse配置步骤,Android 最火高速开发框架AndroidAnnotations简介文章中的简介, ...

  2. Effective C++_笔记_条款00_基本术语

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 下面是每一位C++程序员都应该了解的C++词汇. 1  C++中 ...

  3. android解析xml一直报错org.xmlpull.v1.XmlPullParserException

     错误: org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT @1:2 injava.io.String ...

  4. u-boot的nand驱动写过程分析

    从命令说起,在u-boot输入下列命令: nand write 40008000 0 20000 命令的意思是将内存0x40008000开始的部分写入nand,从nand地址0开始写,写入长度是0x2 ...

  5. 【Demo 0008】标签控制器

    本章学习要点:       1.  了解标签控制器基础知识;       2.  掌握标签控制器层次结构;       3.  掌握标签控制器基本用法;       4.  掌握自定义标签控制器:   ...

  6. Linux入门基础 #9:管道及重定向

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  7. MySQL查看连接数

    MySQL查看连接数 1.查看部分连接数(数目较多时) show processlist; 2.查看所有连接数(数目较多时) show full processlist;

  8. Linux Force DHCP Client (dhclient) to Renew IP Address

    http://www.cyberciti.biz/faq/howto-linux-renew-dhcp-client-ip-address/‘m using Ubuntu Linux. How to ...

  9. 慎得慌风 656ik67o

    http://photo.163.com/q/7634581 http://photo.163.com/q/7634580 http://photo.163.com/q/7634577 http:// ...

  10. android中设置TextView/Button 走马灯效果

    在Android的ApiDemo中,有Button的走马灯效果,但是换作是TextView,还是有一点差异. 定义走马灯(Marquee),主要在Project/res/layout/main.xml ...