插入排序工作原理:
1.将一个数组拆分成两个数组,一个取第一个元素认为是有序的;剩余的元素认为是无序的
2.每次从无序数组中取出第一个元素与有序数组最后一个元素进行比较
待插入元素比较大,则放有序数组后面;如果比较小,则与有序数组倒数第二个进行比较,对有序数组从后往前进行扫描,直到遇到比他小的位置,插到它的后面
3.依次执行上面的操作,直到序列全部有序
数据演示:
待排序序列:10 7 15 2 5 27 13
第0轮:【10】 7 15 2 5 27 13 //循环i=1 当前比较元素下标i
第1轮:【7 10】 15 2 5 27 13
第2轮:【7 10 15】 2 5 27 13
第3轮:【2 7 10 15】 5 27 13
第4轮:【2 5 7 10 15】 27 13
第5轮:【2 5 7 10 15 27】 13
第6轮:【2 5 7 10 13 15 27】
代码实现:
function insertionSort($arr) {
$len = count($arr);
if($len<=0) {
return $arr;
}
for($i=1;$i<$len;$i++) {
$current = $arr[$i]; //无序序列比较值
$curIndex = $i; //无序序列比较值的下标
while($curIndex>0 && $arr[$curIndex-1]>$current) {
$arr[$curIndex] = $arr[$curIndex-1];
$curIndex--; //有序序列从后往前进行比较
}
$arr[$curIndex] = $current;
}
return $arr;
}
print_r(insertionSort($arr));