一、插入排序的基本思想
每次将一个待排序的数,插入到一个已排好序的子集合中,直到集合中所有的数都排好序。
集合S = {S0, S1, ... , Sn-1}
1、子集合 S'是一个有序集合,即是说S'中的数都是已经排好序的,待排序的数设置Si,
开始时S' = {S0} 只有一个数,所以它是有序的集合, i = 1,待排序的数从S1开始;
2、将Si 插入到子集合 S' 中,并将S'排序好序,使得S'是有序集合;
3、i 的值加1,执行第2步,直到i 的值 等于 n-1,即最后一个Sn-1也插入了有序集合S'中,排序结束。
例如:
S = [2, 7, 3, 6, 5, 1]
开始时,设置有序集合是[2]:
[2, 7, 3, 6, 5, 1]
第1次,7是待排序的数,把7插入到有序集合[2]:
[2, 7, 3, 6, 5, 1]
则有序变成[2, 7]
第2次,3是待排序的数,把3插入到有序集合[2, 7]:
[2, 3, 7, 6, 5, 1]
则有序变成[2, 3, 7]
第3次,6是待排序的数,把6插入到有序集合[2, 3, 7]:
[2, 3, 6, 7, 5, 1]
则有序变成[2, 3, 6, 7]
第4次,5是待排序的数,把5插入到有序集合[2, 3, 6, 7]:
[2, 3, 5, 6, 7, 1]
则有序变成[2, 3, 5, 6, 7]
第5次,1是待排序的数,把1插入到有序集合[2, 3, 5, 6, 7]:
[1, 2, 3, 5, 6, 7]
则有序变成[1, 2, 3, 5, 6, 7]
集合S的数已经全部插入有序集合中,排序结束。
二、插入排序的java实现
public class InsertionSort {
public static void sort(int[] ints){
int lastIndex = ints.length -1;
for(int firstIndex = 1; firstIndex <= lastIndex; firstIndex++){
sort(ints, 0, firstIndex);
}
}
/**
* 有序集合:S' = { ints[fromIndex], ... , ints[targetIndex - 1] }
* ints[targetIndex]:待排序的数
* */
public static void sort(int[] ints, int fromIndex, int targetIndex){
//fromIndex to (targetIndex - 1) has sorted.
while(fromIndex < targetIndex){
if(ints[fromIndex] >= ints[targetIndex]){
int immutable = ints[targetIndex];
//找到ints[targetIndex]应该所在的位置,
//则将fromIndex, ..., targetIndex - 1, 移到 fromIndex + 1, ..., targetIndex
move(ints, fromIndex, targetIndex);
ints[fromIndex] = immutable;
break;
}
fromIndex++;
}
}
/**
* 将下标位置在fromIndex, ..., toIndex - 1的数, 移到 fromIndex + 1, ..., toIndex
* */
private static void move(int[] ints, int fromIndex, int toIndex){
while(fromIndex < toIndex){
ints[toIndex] = ints[--toIndex];
}
}
public static void main(String[] args){
int[] ints = {2, 7, 3, 6, 5, 1};
System.out.println(Arrays.toString(ints));
sort(ints);
System.out.println(Arrays.toString(ints));
}
}
...