1 今天在看算法导论的时候被一个插入排序给卡住,于是小结一下。时间复杂度最坏为O(n^2),最好为O(n)。
2 还有一个问题:对于一个长度为n的数组,如果该数组每k个单元分为一组,假设为k1,k2….,其中k2中的元素都大于k1中的元素。那么称该数组为分段有序的。对于该数组,对每个分段进行插入排序后再合并成一个有序数组与对数组整体进行插入排序的时间复杂度是相同的,均为O(kn).
对于此可以这样理解,当对整个数组进行插入排序时,其实进行插入比较的只是本段之内的元素,当插入位置指定到前一段时,会因为不满足条件a[p]>=a[i]而结束该次循环。
package Array_;
public class Insert_Sorted {
/*
* O(n^2);
*/
public static void Insert_Sort(int[] a){
if(a.length==1){
System.err.println("The length of Array is 1");
}
int temp;
int p;
for(int i=1;i<a.length;i++){
temp=a[i]; //存储带插入元素;
p=i-1; //记录当前比较下标;
while(p>=0&&a[p]>=a[i]){ //将较大元素向后移,腾出一个空位
a[p+1]=a[p];
--p;
}
a[p]=temp; //元素插入;
}
}
}