//直接插入排序
public class charu {
public static void main(String[] args) {
int[] aa={1,4,5,2,3,7,10};
int[] bb={1,2,43,111,23,54,79,8,0};
System.out.println("排序前:");
for (int i = 0; i < aa.length; i++) {
System.out.print(aa[i]+" ");
}
System.out.println();
System.out.println("排序后:");
Insertsort(aa);
for (int i = 0; i < aa.length; i++) {
System.out.print(aa[i]+" ");
}
System.out.println();
System.out.println("改善后的直接插入排序前:");
for (int i = 0; i < bb.length; i++) {
System.out.print(bb[i]+" ");
}
System.out.println();
System.out.println("改善后的直接插入排序后:");
BestInsertsort(bb);
for (int i = 0; i < bb.length; i++) {
System.out.print(bb[i]+" ");
}
}
private static void Insertsort(int[] aa) {
int temp=0;
int i,j;
for ( i = 1; i < aa.length; i++) {//从第一个开始
temp=aa[i]; //记录待插记录
for ( j = i-1; j>0&&temp< aa[j]; j--) { //从待插记录的前一个开始找,只要比待插记录大,就统一后移
aa[j+1]=aa[j]; //后移
}
aa[j+1]=temp; //直到找到比待插记录小的,说明找到了正确位置,此时指向这个小的的下一个就是待插的位置
}
}
private static void BestInsertsort(int[] aa) {
int temp=0;
int i,j;
for ( i = 1; i < aa.length; i++) {//从第一个开始
if(aa[i]<aa[i-1]){//加一个判断,当后一个本来就是比前一个大时,就不用排序了
temp=aa[i]; //记录待插记录
for ( j = i-1; j>=0&&temp< aa[j]; j--) { //从待插记录的前一个开始找,只要比待插记录大,就统一后移
aa[j+1]=aa[j]; //后移
}
aa[j+1]=temp; //直到找到比待插记录小的,说明找到了正确位置,此时指向这个小的的下一个就是待插的位置
}
}
}
}
运行结果:
排序前:
1 4 5 2 3 7 10
排序后:
1 2 3 4 5 7 10
改善后的直接插入排序前:
1 2 43 111 23 54 79 8 0
改善后的直接插入排序后:
0 1 2 8 23 43 54 79 111
时间复杂度:
最好:o(n),也就是数组有序,只需要每次都比较
最坏:o(n^2)刚好是有序的逆序,要交换n次
辅助空间:temp
稳定性:稳定(如果存在两个相同值,在排序后,他们的相对位置不会改变,因为交换条件是temp< aa[j],若换成小于等于,则不稳定)