折半插入排序(Binary Insertion Sort)是对插入排序算法的改进。
排序思想:
- 有一组数据待排序,排序区间为Array[0]~Array[n-1]。
- 将数据分为有序数据和无序数据,第一次排序是默认Array[0]为有序数据,Array[1]~Array[n -1]为无序数据;有序数据分区的第一个元素位置为low,最后一个元素位置为high;
- 遍历无序区间的所有元素,每次去无序区间的第一个元素Array[i],因为1~i-1是有序排列的,所以用中间点m将其平均分为俩部分,然后将待排序的数据用中间位置m的数据作比较,若待排序的数据较大,则low ~m-1分区的数据都比你待排序数据小;反之,若待排序数据较小,则m+1 ~ high分区的数据都比待排序数据大,此时将low或high重新定义为新的合适区的边界;
- 对新的小分区重复上面的操作;
- 直到low和high的前后顺序改变,此时high+1所处的位置为待排序数据的合适位置。
eg:折半插入排序:
public static void BinarySort(int array[]){
int n = ;
if(n <= 1){
return;
}else{
for(int i = 1;i < n;i++){
int value = array[i];
int low = 0;
int high = i - 1;
int j = i - 1;
while (low <= high){
int mid = low + (high - low)/ 2;
if (array[mid] < value) {
low = mid + 1;
}else{
high = mid - 1;
}
}
//找到插入位置high+1;
for(;j >= high + 1;j--){
array[j+1] = array[j];
}
array[j+1] = value;
}
}
}
折半插入排序在数据集无序的情况下要优于直接插入排序,但是在近乎有序的数据集下,由于插入排序只比较一次,因此最好情况下的直接插入排序要优于这般插入排序。
时间、空间、稳定性均与直接插入排序相同,只是元素比较次数不同而已。