二分插入排序属于插入排序的一种,是一种稳定的排序.(相等的元素顺序没有改变)
- 最坏情况:每次都在有序序列的起始位置插入,则整个有序序列的元素需要后移,时间复杂度为O(n2)
- 最好情况:待排序数组本身就是正序的,每个元素所在位置即为它的插入位置,此时时间复杂度仅为比较时的时间复杂度,为O(log2n)
- 平均情况:O(n2)
空间复杂度上,二分插入也是就地排序,空间复杂度为(O(1))。
int a[]={2,45,34,324,2,3,7,555,46,34};
public void testTwoBinary(){
for(int i=0;i<a.length;i++){
int temp=a[i];
int left=0;
int right=i-1;
int mid;
//找到插入位置
while(left<=right){
mid=(left+right)/2;
if(temp<a[mid]){
//低位
right=mid-1;
}else{
//高位
left=mid+1;
}
}
//大于插入元素元素后移
for(int j=i-1;j>=left;j--){
a[j+1] = a[j];
}
//插入元素 left or high + 1
a[left] = temp;
}