红宝书版本:
public class Insertion { public static void sort(Comparable[] a) { int N=a.length; for(int i =1;i<N;i++) { for(int j=i;j>0&& less(a[j],a[j-1]);j--) exch(a,j,j-1); } } }
int数组:
private static int[] insertSort(int[]arr){ if(arr == null || arr.length < 2){ return arr; } for(inti=1;i<arr.length;i++){ for(intj=i;j>0;j--){ if(arr[j]<arr[j-1]){ //TODO: int temp=arr[j]; arr[j]=arr[j-1]; arr[j-1]=temp; }else{ //接下来是无用功 break; } } } return arr; }
- 插入排序的本质是从第二个元素开始,将当前位置上的元素同前一个元素比较,符合条件时即交换顺序。如果一个元素小于其前面的所有元素,该元素会一步一步地挪到第一位。
- 插入排序所需时间取决于元素的初始顺序,即接近有序的数组使用插入排序会很快。最好情况(完全有序)需要N-1次比较,0次交换;最坏情况(完全逆序),需要~N²/2次比较和交换。