这里记录下插入排序的实现代码和其复杂度分析。
实现代码:
public class Insertion {
public static void sort(int[] a) {
for(int i=1;i<a.length;i++) {
for(int j=i;j>0&&a[j]<a[j-1];j--) {
exch(a,j,j-1);
}
}
}
public static void sortX(int[] a) {
for(int i=1;i<a.length;i++) {
int temp=a[i];
int j=i;
for(;j>0&&temp<a[j-1];j--) {
a[j]=a[j-1];
}
a[j]=temp;
}
}
public static void exch(int[] a,int i,int j) {
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
时间复杂度
在最好情况下,数组是有序的,每插入一个元素,只需考察前一个元素,时间复杂度为O(n)。
在最坏情况下,数组完全逆序,插入第2个元素需考察前1个元素,插入第3个元素需考察前2个元素,插入第N个元素需考察前N-1个元素,比较次数即为1+2+…+N-1,即N2/2,时间复杂度为O(n2)。
所以平均时间复杂度是介于O(n)到O(n2)之间。