PHP代码如下:
<?php
/*
*算法:插入排序
*算法思想:
*
* 1.数组A的最后元素A[$j],令$i = $j -1,A[$i]
* 2.第A[$i]个与A[$j]比较,如果A[$j] < A[$i],它们的值交换。
* 3.它们的值都减少1,然后返回步骤1
* 4. 从第二个元素开始排序,每次比较到第一个元素时停止
* 5. 最后一个元素与前面的排序完成后,算法结束
*算法复杂度:
* n(n+1)/2
*/
function insertionSort( $sortarray ) {
$count = count( $sortarray );
for( $j = 1; $j < $count; $j++ )
{
$key = $sortarray[$j];
$i = $j -1;
while( $i >= 0 and $key < $sortarray[$i] )
{
$sortarray[$i+1] = $sortarray[$i];
$i--;
$sortarray[$i+1] = $key;
}
}
return $sortarray;
}
$testArray = array('2','4','8','3','9','1','5','7','0','6');
$result = insertionSort($testArray);
var_dump($result);
?>
插入排序的策略:
从前面开始,每次都与前一个对比,如果符合要求则进行交换位置,如果不符合继续往前对比,直到第一个为止
插入排序的步骤:
取元素:从前面开始取值,一次往后取值
对比:取出的值与前面值的对比
交换:如果满足要求则交换值,不满足则继续往前对比,直到第一个
伪代码如下:
INSERTION-SORT(A)
1 for j ← 2 to length[A]
2 do key ← A[j]
3 ▹ Insert A[j] into the sorted sequence A[1 ‥ j - 1].
4 i ← j - 1
5 while i > 0 and A[i] > key
6 do A[i + 1] ← A[i]
7 i ← i - 1
8 A[i + 1] ← key
过程如图所示:
算法分析:
数组长度为n,从第二个开始取值,一共取了n-1次,每次最差的算法是都进行对比,第二个进行1次对比,第三个进行2次对比,第n个进行n-1对比。
总共的代价就是 1+ 2 + 3 +...+ n = n(n+1)/2;
略低阶项和常量c,即得到结果:Θ(n2).