折半插入排序(Binary Insertion Sort)是直接插入排序的一种改进版本,主要区别在于寻找插入位置的方式。在直接插入排序中,我们使用线性搜索来找到新元素应该插入的位置,而在折半插入排序中,我们使用二分搜索来加快查找速度。
以下是折半插入排序的详细步骤:
折半插入排序的时间复杂度与直接插入排序相同,都是O(n^2)。但折半插入排序在某些情况下可以略微提高效率,因为它减少了线性搜索的时间。然而,由于折半插入排序仍然是一种比较简单的排序算法,因此在处理大规模数据时可能不够高效。
#include <iostream>
using namespace std;
// 折半插入排序函数
void binaryInsertionSort(int arr[], int n) {
for (int i = 1; i < n; i++) { // 从第二个元素开始遍历数组
int key = arr[i]; // 保存当前元素的值
int low = 0, high = i - 1; // 二分搜索的初始范围
while (low <= high) { // 进行二分搜索
int mid = low + (high - low) / 2; // 计算中间位置
if (arr[mid] > key) { // 如果中间元素大于新元素
high = mid - 1; // 在左侧继续搜索
} else {
low = mid + 1; // 在右侧继续搜索
}
}
for (int j = i - 1; j >= low; j--) { // 将已排序元素向后移动
arr[j + 1] = arr[j];
}
arr[low] = key; // 将当前元素插入到已排序序列中的正确位置
}
}
// 测试代码
int main() {
int arr[] = {5, 2, 4, 6, 1, 3}; // 待排序数组
int n = sizeof(arr) / sizeof(arr[0]); // 数组长度
binaryInsertionSort(arr, n); // 对数组进行折半插入排序
for (int i = 0; i < n; i++) { // 输出排序后的数组元素
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
代码总结:
折半插入排序是直接插入排序的一种改进版本,通过使用二分搜索来加快查找插入位置的速度。在实现上,折半插入排序仍然采用就地排序,不需要额外的存储空间。时间复杂度与直接插入排序相同,都是O(n^2)。然而,由于折半插入排序在某些情况下可以略微提高效率,因此在处理小规模数据时可能具有更好的性能。但需要注意的是,折半插入排序仍然是一种比较简单的排序算法,因此在处理大规模数据时可能不够高效。