插入排序
就像我们整理扑克牌一样:摸起一张牌,然后将牌插入到合适位置;
示意:
需要被排序的数组: [10, 3, 2, 1, 0, 5, 4, 7, 8, 9]
第1次: [3, 10, 2, 1, 0, 5, 4, 7, 8, 9] 将3插入有序数组【10】之中
第2次: [2, 3, 10, 1, 0, 5, 4, 7, 8, 9] 将2插入有序数组【3、10】之中
第3次: [1, 2, 3, 10, 0, 5, 4, 7, 8, 9] 将1插入有序数组【2、3、10】之中
第4次: [0, 1, 2, 3, 10, 5, 4, 7, 8, 9] 将0插入有序数组【1、2、3、10】之中
第5次: [0, 1, 2, 3, 5, 10, 4, 7, 8, 9] 将5插入有序数组【0、1、2、3、10】之中
第6次: [0, 1, 2, 3, 4, 5, 10, 7, 8, 9] 将4插入有序数组【0、1、2、3、5、10】之中
第7次: [0, 1, 2, 3, 4, 5, 7, 10, 8, 9] 将7插入有序数组【0、1、2、3、4、5、10】之中
第8次: [0, 1, 2, 3, 4, 5, 7, 8, 10, 9] 将8插入有序数组【0、1、2、3、4、5、7、10】之中
第9次: [0, 1, 2, 3, 4, 5, 7, 8, 9, 10] 将9插入有序数组【0、1、2、3、4、5、7、9、10】之中
代码
public static void insert_sort(int arr[]){
int temp, j;
for(int i = 1; i < arr.length; i++){
temp = arr[i];
// 以i位置为分割线, [0, i-1]为一个有序数组, [i, arr.length]为无序数组
// 用temp临时变量保存i位置的数据, 然后拿i位置的数据arr[i] 和 [0, i-1]之内的有序数组,
// 进行比较放到有序数组中比这个数字最后一个大的数据的后面。
for(j = i; j > 0 && arr[j-1] > temp; j--){
arr[j] = arr[j-1]; // 向前移动一个位置
}
arr[j] = temp; // 插入比这个数最后一个大的后面
System.out.println("第" + i + "次: " + Arrays.toString(arr));
}
}
public static void main(String[] args){
int arr[] = new int[] {10, 3, 2, 1, 0, 5, 4, 7, 8, 9};
System.out.println("原数组:");
System.out.println(Arrays.toString(arr));
InsertSort.insert_sort(arr);
System.out.println("现数组:");
System.out.println(Arrays.toString(arr));
}
时间复杂度分析
把n个元素的序列 升序 排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。如果需要排序的数据量很小,那么插入排序还是一个不错的选择。