算法入门之插入排序

来源:互联网 发布:windows如何一键锁屏 编辑:程序博客网 时间:2024/05/06 01:58

插入排序原理:

从数组第二个元素开始插入,与之前的元素进行比较大小,如果小于前一项,则交换位置,直到找到合适的位置,否则开始插入第三个元素,以此类推

这个过程跟我们玩儿扑克排牌的过程是一样的,拿到新牌后逐一跟之前的牌进行比较,最终把牌插入合适的位置,二者的区别是拿牌找到合适位置后把后边的牌全部向后移动一个单位,而插入排序是比较一次移动一次,其实是一样的

插入排序要比选择排序的效率高一些,因为判断大小的次数要少

实现如下:

function exch(&$a, $i, $j) {    $tmp = $a[$i];    $a[$i] = $a[$j];    $a[$j] = $tmp;}function less($m, $n) {    return $m < $n;}function insert_sort(&$arr) {    $len = count($arr);    for($i = 1; $i < $len; $i++) { //对第i个元素进行插入        for($j = $i;$j > 0 && less($arr[$j], $arr[$j-1]); $j--) { //若j前还有元素且之前的元素大于自己,则进行交换            exch($arr, $j, $j-1);        }    }}$a = array(7, 2, 5, 3, 8, 4, 9, 1, 6);echo "7-2-5-3-8-4-9-1-6<br/>";insert_sort($a);print_r($a);

排序过程如下:

array(7, 2, 5, 3, 8, 4, 9, 1, 6);//原始数组

array(2, 7, 5, 3, 8, 4, 9, 1, 6);//插入第2个元素2,移动第一次

array(2, 5, 7, 3, 8, 4, 9, 1, 6);//插入第3个元素5,移动第一次

array(2, 5, 3, 7, 8, 4, 9, 1, 6);//插入第4个元素3,移动第一次

array(2, 3, 5, 7, 8, 4, 9, 1, 6);//插入第4个元素3,移动第二次

array(2, 3, 5, 7, 8, 4, 9, 1, 6);//插入第5个元素8,不用移动

array(2, 3, 5, 7, 4, 8, 9, 1, 6);//插入第6个元素4,移动第一次

array(2, 3, 5, 4, 7, 8, 9, 1, 6);//插入第6个元素4,移动第二次

array(2, 3, 4, 5, 7, 8, 9, 1, 6);//插入第6个元素4,移动第三次

array(2, 3, 4, 5, 7, 8, 9, 1, 6);//插入第7个元素9,不用移动

array(2, 3, 4, 5, 7, 8, 1, 9, 6);//插入第8个元素1,移动第一次

array(2, 3, 4, 5, 7, 1, 8, 9, 6);//插入第8个元素1,移动第二次

array(2, 3, 4, 5, 1, 7, 8, 9, 6);//插入第8个元素1,移动第三次

array(2, 3, 4, 1, 5, 7, 8, 9, 6);//插入第8个元素1,移动第四次

array(2, 3, 1, 4, 5, 7, 8, 9, 6);//插入第8个元素1,移动第五次

array(2, 1, 3, 4, 5, 7, 8, 9, 6);//插入第8个元素1,移动第6次

array(1, 2, 3, 4, 5, 7, 8, 9, 6);//插入第8个元素1,移动第7次

array(1, 2, 3, 4, 5, 7, 8, 6, 9);//插入第9个元素6,移动第1次

array(1, 2, 3, 4, 5, 7, 6, 8, 9);//插入第9个元素6,移动第2次

array(1, 2, 3, 4, 5, 6, 7, 8, 9);//插入第9个元素6,移动第3次,结果

0 0
原创粉丝点击