插入排序:
public class insert {
public static void main(String[] args) {
int a[] = {0,49,38,65,97,76,13,27,49};
f(a);
for (int i = 1; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
private static void f(int[] a) {
for (int i = 2; i < a.length; ++i) {//第i趟排序
if(a[i]<a[i-1]) {//先判断相邻的两个数大小,如果a[i]大,那么直接进入下一趟遍历,如果a[i]小,往下进行
a[0] = a[i];//把a[i]给哨兵,留作判断
a[i] = a[i-1];//已经知道a[i-1]小与a[i],所以a[i-1]直接后移
int j = 0;
for (j = i - 2; a[0]<a[j]; --j) {//从倒数第二个数开始判断,是否需要后移
a[j+1] = a[j];
}
a[j+1] = a[0];//把哨兵放在正确位置
}
}
}
}
折半插入排序:
public class selfinsert {
public static void main(String[] args) {
int a[] = {0,49,38,65,97,76,13,27,49};
f(a);
for (int i = 1; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
private static void f(int[] a) {
for (int i = 2; i < a.length; ++i) {
a[0] = a[i];
int low = 1;
int height = i - 1;
while(low<=height) {
int m = (height+low)/2;
if(a[m]<a[0]) low = m+1;
else height = m-1;
}
for (int j = i-1; j > height; --j) a[j+1] = a[j];
a[low] = a[0];
}
}
}
他们的时间复杂度和空间复杂度一样,相对于简单的插入排序,折半插入排序减少了比较的次数,移动次数并没有改变
时间复杂度:O(n^2)
空间复杂度:O(1)