package datastruts;
public class BInsertSort {
/**
* 折半插入排序算法
* 排序数组为array = {0,38,65,97,76,12,27,49};
* author:went
* */
public void bInsertSort(int[] array){
int temp = 0 ;//存储临时变量
/**
* 数组下标从零开始,i 是接下来要插入的数的下标
* */
for(int i = 1 ; i < array.length ; ++i){
//把即将要插入的数存储在临时变量里
temp = array[i] ;
/**
* 折半查找算法找到正确的插入位置
* 当插入的数最大时,low = mid + 1 ,最终 low = high + 1 正确的插入位置是下标是 high+1 或者 low
* 当插入的数最小时,high = mid — 1 ,最终 high = low – 1 ,正确的插入位置下标是 high +1 或者是low
* */
int high = i-1 ;//这里为什么是i-1 ? 解释:i 即将插入的数,有序的数列的长度的i-1 。所以high=i-1
int low = 0 ;
while( low <= high ){
int mid = (low + high) / 2 ;
if(temp < array[mid] ) { high = mid – 1 ; }
else { low = mid + 1 ; }
}
//当找到正确的插入位置时,数据向后移动
for( int j = i-1 ; j >= low ; –j){
array[j+1] = array[j] ;
}
//插入数据
array[low] = temp ;
}
}
public static void main(String[] args){
BInsertSort bs = new BInsertSort();
int[] array = {0,38,65,97,76,12,27,49};
bs.bInsertSort(array);
for(int j = 0 ; j < array.length ; ++j ){
System.out.print(array[j]+”,”);
}
}
}