折半插入排序算法是对直接插入排序算法的简单改进,主要将折半比较的思想引入插入排序,在一定程度上提高了直接插入排序的效率。
算法描述
直接插入排序算法中,当第i-1趟需要将第i个元素插入到0~i-1个元素之间时,总是需要从第i-个元素开始,依次与前面的每一个元素进行比较,直至找到合适的位置进行插入。这样比较的过程显然没有利用到0~i-1个元素已经有序这一有效信息,折半插入排序则对此进行了改进。当需要将第i个元素插入到先前有序列表中去时,折半排序的做法是:
- 首先选取0~i-1个有序列表元素的中间元素,即位置为(i-1)/2的元素,与需要插入的第i个元素进行比较,如果位置为(i-1)/2处的元素大于第i个元素,则在位置区间为0~(i-1)/2-1的范围内进行搜索,反之则在(i-1)/2+1~i-1的范围内进行搜索。以上过程即是折半的思想;
- 在以上半个范围内进行搜索时,可以重复1中的搜索方法,这样即把搜索区间逐渐缩小为1/4,1/8等,从而较快的定位合适的插入位置。
算法分析
折半插入排序的时间复杂度:
折半插入排序算法相对直接插入排序算法减少了插入位置的寻找比较次数,但是没有减少元素的移动次数,所以排序的时间复杂度没有大的变化,基本和直接插入排序保持一致。
算法Java代码实现
import java.util.Arrays;
public class BinaryInsertSort {
public static void binaryInsertSort(int[] data,int n){
for(int i=1; i<n; i++){
int tmp = data[i];
int low = 0;
int high = i-1;
// 不断折半,寻找合适的插入位置
while(low <= high){
int mid = (low + high) / 2;
if(tmp>data[mid]){
low = mid + 1;
}else{
high = mid - 1;
}
}
// 依次将元素后移
for(int j=i; j>low ; j--){
data[j] = data[j-1];
}
data[low] = tmp;
}
}
1398

被折叠的 条评论
为什么被折叠?



