对于冒泡和选择我一看就明白是怎么回事了,但是这个插入排序让我蒙圈了几分钟,再仔细一看,恍然大悟,抓住“局部有序”找到突破口。这就很灵性了,我先不管后面的数据项到底是什么样的,但是我可以在这组数据中标记一个位置,我可以确保,在我的标记位置之前的数据是有序的。talk is cheap show my code!
package javal.util.test; public class InsertSort { //先使局部有序 public static void insertSort(long[] array) { int in, out, len=array.length; for(out = 1; out< len ; out ++) { long temp = array[out]; in = out; while(in >0 && array[in -1] >= temp) { array[in] = array[in -1]; --in; } array[in] =temp; } } public static void main(String[] args) { long[] array = new long[] {2,8,3,5,1,2356,776}; insertSort(array); for (long l : array) { System.out.println(l); } } }插入排序的几个注意点:
1.外层for循环,out变量从1开始,向右移动,它标记了未排序数据的最左端数据。
2.内层while循环中, in 变量从out变量位置开始,向左移动,直到temp变量小于in所指的数据项,或者直到它不能再左移为止,while 循环每执行一次,都向右移动了一个已排序的数据项。
ps:上叙程序中 下标为1的 左边的数据肯定是有序的,如果有序的个数更多,那么标记的下标位置也可以变大。那么再看上述程序,其实标记位置也可以为2. 道理显而易见,因为 下标2之前的数据是有序的。