直接插入排序和二分法插入排序的区别。
- 相同之处:
插入第i个元素时, 前i-1个元素已经是有序的
- 不同之处:
直接插入排序在寻找子数组(前i-1个元素组成的有序数组)中的插入位置时,是拿待插入的元素和子数组里的元素按顺序从左到右或从右到左一个一个比较来确定待插入的位置。
二分法插入排序是拿待插入元素和有序子数组中间位置的元素比较,以当前的中间位置为分界点来确定待插入元素在该分界点的左边还是右边, 如果在左边, 就把分界点左边的元素序列当作下一次的要寻找的子数组(不包括中间元素)。 如果在右边, 就把分界点右边的元素序列当作下一次的要寻找的子数组(不包括中间元素)。重复上述过程直到子数组的长度小于1查找结束。
/**
* 二分法插入排序
*
*/
public class BinaryInsertSort {
public void binaryInsertSort(int[] array) {
for (int i = 1; i < array.length; i++) {
int temp = array[i]; // 待插入的元素
int left = 0; // 已有序序列的起始下标
int right = i - 1; // 已有序序列的结束下标
int middle = 0; // 已有序序列的中间下标
// 利用二分法寻找插入位置
while (left <= right) {
middle = (left + right) / 2;
if (temp > array[middle]) {
left = middle + 1;
} else {
right = middle - 1;
}
}
// 找到了元素的插入位置, 把下标从left开始往后的所有元素后移一位(包括left位置的元素)
for(int j = i - 1; j >= left; j--) {
array[j + 1] = array[j];
}
// 待插入的元素归位
if(i != left) {
array[left] = temp;
}
}
display(array);
}
public void display(int[] array) {
for(int x: array) {
System.out.print(x + " ");
}
}
public static void main(String[] args) {
int[] array = {1,3,4,3,8,3,2,6,7,4,9,10,0,-1,-7,4,2,9,7,20};
BinaryInsertSort insertSort = new BinaryInsertSort();
insertSort.binaryInsertSort(array);
//结果: -7 -1 0 1 2 2 3 3 3 4 4 4 6 7 7 8 9 9 10 20
}
}