折半插入排序是对直接插入排序进行了改进,在寻找插入点时使用二分查找算法,提高了查询效率。
升序排序:
/**
* 折半插入排序
* 升序排序
*/
@Override
public <T extends Comparable<? super T>> void sortByAsc(T[] data) {
for(int i = 1;i < data.length;i++ ){
if(data[i].compareTo(data[i - 1]) < 0){
/**记录i的值*/
T temp = data[i];
/**记录搜索范围的左边界*/
int low = 0;
/**记录搜索范围的右边界*/
int high = i - 1;
while(low <= high){
/**记录中间位置*/
int mid = (high + low)/2;
/**比较中间位置数据和i处数据大小,以缩小搜索范围*/
if(data[mid].compareTo(temp) < 0){
low = mid + 1;
}else{
high = mid - 1;
}
}
/**移动low~i处数据整体向后移动*/
for(int j = i; j > low; j--){
data[j] = data[j - 1];
}
data[low] = temp;
}
}
}
降序排序:
/**
* 折半插入排序
* 降序排序
*/
@Override
public <T extends Comparable<? super T>> void sortByDesc(T[] data) {
for(int i = 1;i < data.length;i++ ){
if(data[i].compareTo(data[i - 1]) > 0){
/**记录i的值*/
T temp = data[i];
/**记录搜索范围的左边界*/
int low = 0;
/**记录搜索范围的右边界*/
int high = i - 1;
while(low <= high){
/**记录中间位置*/
int mid = (high + low)/2;
/**比较中间位置数据和i处数据大小,以缩小搜索范围*/
if(data[mid].compareTo(temp) > 0){
low = mid + 1;
}else{
high = mid - 1;
}
}
/**移动low~i处数据整体向后移动*/
for(int j = i; j > low; j--){
data[j] = data[j - 1];
}
data[low] = temp;
}
}
}