- 一般直接插入排序的时间复杂度为O ( n^2 ) ,但是当数列基本有序时,如果按照有数列顺序排时,时间复杂度将改善到O( n )
1 <?php 2 #指定部分数组元素全部向后移动一位 3 function move(Array $arr, $start = null, $end = null) { 4 if(!isset($start) || $start < 0) $start = 0; 5 if(!isset($end) || $end >= count($arr)) $end = count($arr) - 2; #最后只能选到倒数第二个元素 6 for($i = $end; $i >= $start; $i--) { 7 $arr[$i + 1] = $arr[$i]; 8 } 9 return $arr; 10 } 11 12 #插入排序,使用同一个数组后移方法实现 13 function insertSort(Array $arr) { 14 for($i = 1; $i < count($arr); $i++) { #未排序数组,从第二个元素开始 15 $insertEle = $arr[$i]; #待插入元素 16 for($j = 0; $j < $i; $j++) { #已排序好数组,从第一个元素开始 17 if($arr[$j] > $arr[$i]) { #按升序排序 18 $arr = move($arr, $j, $i - 1); #先将已排序好数组中大于待插入元素的元素全部后移一位 19 $arr[$j] = $insertEle; #插入待插入元素 20 break; 21 } 22 } 23 } 24 return $arr; 25 } 26 27 $arr = array(5, 1, 7, 4, 6, 2); 28 $arr = insertSort($arr); 29 print_r($arr); 30 ?>
输出:
Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 5 [4] => 6 [5] => 7 )
排序过程如下,红色为已排好序部分