1. 基本思想
直接插入排序时,前半段均为有序序列,但是查找方式顺序向前找,效率很低。而在有序序列中查找插入数的位置时采用二分法便可提高查找效率。 故可对直接插入排序进行如下改造即可。
2. 代码实现
// 二分插入排序(递增)
void BinInsertSort(int array[], int size) {
for (int i = 1; i < size; ++i) { // 遍历array
if (array[i] < array[i - 1]) {
int k = array[i];
int j = i - 1;
int left = 0, right = i - 1, mid = 0; // 直接对前段数据进行二分查找,找到array[i]应有的位置
while (left <= right) {
mid = (left + right) / 2; // 取中间位置
if (k < array[mid]) {
right = mid - 1; // 插入点在左半区
}
else {
left = mid + 1; // 插入点在右半区
}
} // 找到位置 right
for (j; j >= right + 1; --j) {
array[j + 1] = array[j]; // 将大于array[i]的元素向后移动,注意从后向前赋值
}
array[right + 1] = k; // 在前半段有序处插入array[i]
}
}
}
测试数据:int array[] = { 3, 9, 1, 4, 2, 8, 2, 7, 5, 3, 6, 11, 9, 4, 2, 5, 0, 6 };
3. 性能分析
时间复杂度
- 最坏 O ( n 2 ) O(n^2) O(n2) 已经逆序
- 平均 O ( n 2 ) O(n^2) O(n2) 在 n n n较大时会减少元素比较的次数,但元素移动次数不变,所以平均时间复杂度为 O ( n 2 ) O(n^2) O(n2)
- 最好 O ( n ) O(n) O(n) 已经有序
空间复杂度
- O ( 1 ) O(1) O(1)
排序稳定性
- 稳定