二分排序是指利用二分法的思想对插入排序进行改进的一种插入排序算法,不同于二叉排序,可以利用数组的特点快速定位指定索引的元素。
算法思想
二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。
具体实现算法如下:
public class BinarySort {
private int[] array;
public BinarySort(int[] array) {
this.array = array;
}
public void sort() {
if (array == null) {
throw new RuntimeException("array is null");
}
if (array.length > 0) {
for (int i = 1; i < array.length; i++) {
//i是接下来将要进行插入排序的
int temp = array[i];
// 二分查找插入位置,0...i-1代表已经排好序的
int insertIndex = binarySearch(i - 1, temp);
// if i== insertIndex 不需要移动
if (i != insertIndex) {
// 移动需要移动的元素
for (int j = i - 1; j >= insertIndex; j --) {
array[j + 1] = array[j];
}
// 插入元素
array[insertIndex] = temp;
}
}
}
}
public void print() {
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
/**
* 二分查找定位插入索引
* @param maxIndex 有序区最大索引
* @param data 要找的值
* @return
*/
private int binarySearch(int maxIndex, int data) {
int start = 0;
int end = maxIndex;
int mid = -1;
while (start <= end) {
mid = (start + end) / 2;
if (array[mid] > data) {
end = mid - 1;
} else {
// 如果相等,也插入在后面
start = mid + 1;
}
}
return start;
}
}
二分排序的
时间复杂度是O(n^2)这与普通插入排序是一样的,但是比较次数更少,更快
空间复杂度O(1),是稳定排序。