百度了下插入式排序,百度百科中php版本的插入式排序如下:
1functioninsert_sort($arr) {2//将$arr升序排列3$count=count($arr);4for($i=1;$i<$count;$i++) {5$tmp=$arr[$i];6$j=$i- 1;7while($j>=0 &&$arr[$j] >$tmp) {8$arr[$j+1] =$arr[$j];9$j--;10}11if(($j+1) !=$i) {12$arr[$j+1] =$tmp;13}14}15return$arr;16}
看着实在是别扭,然后就翻了下Robert Sedgewick写的《算法》,书中的代码都是用java实现的,在这里将插入式排序改用php重写一下:
1functionnew_insert_sort($arr) {2//将$arr升序排列3$count=count($arr);4for($i=1;$i<$count;$i++) {// 索引,完成一次插入就需要将索引$i右移5//将arr[i]插入到a[i-1]、a[i-2]、a[i-3]...之中,也就是如果符合条件就交换位置6for($j=$i;$j>0 &&$arr[$j] <$arr[$j-1];$j--) {7$tmp=$arr[$j];8$arr[$j] =$arr[$j-1];9$arr[$j-1] =$tmp;10}11}12return$arr;13}
我觉得第二种写法更容易让人理解,就像《算法》中写到:插入式排序就像爱玩扑克牌的人整理牌一样,将每一张牌插入到其他已经排好序的牌的适当位置。另外,百度时还发现了博客园的文章Frank Fan的文章插入式排序,也可以看看。