对于冒泡和选择我一看就明白是怎么回事了,但是这个插入排序让我蒙圈了几分钟,再仔细一看,恍然大悟,抓住“局部有序”找到突破口。这就很灵性了,我先不管后面的数据项到底是什么样的,但是我可以在这组数据中标记一个位置,我可以确保,在我的标记位置之前的数据是有序的。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之前的数据是有序的。