折半插入排序(Binary Insertion Sort)是插入排序的优化版本,通过二分查找快速定位插入位置,减少比较次数,提升排序效率。本项目提供Python/C++双语言实现、性能对比测试及进阶优化方案,适用于算法学习、工程实践和性能优化研究。
步骤 | 操作描述 | 时间复杂度 |
---|---|---|
1 | 遍历未排序元素(从第2个开始) | O(n) |
2 | 对当前元素使用二分查找确定插入位置 | O(log n) |
3 | 移动元素腾出插入空间 | O(n) |
4 | 插入元素到正确位置 | O(1) |
动态演示:
初始数组:[3, 1, 4, 5, 2]
第1轮:找到1的插入位置 → [1, 3, 4, 5, 2]
第4轮:找到2的插入位置 → [1, 2, 3, 4, 5]
步骤 | 操作描述 | 时间复杂度 |
---|---|---|
1 | 遍历未排序元素(从第2个开始) | O(n) |
2 | 对当前元素使用二分查找确定插入位置 | O(log n) |
3 | 移动元素腾出插入空间 | O(n) |
4 | 插入元素到正确位置 | O(1) |
动态演示:
初始数组:[3, 1, 4, 5, 2]
第1轮:找到1的插入位置 → [1, 3, 4, 5, 2]
第4轮:找到2的插入位置 → [1, 2, 3, 4, 5]
def binary_insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
# 二分查找插入位置
left, right = 0, i-1
while left <= right:
mid = (left + right) // 2
if arr[mid] < key:
left = mid + 1
else:
right = mid - 1
# 移动元素并插入
for j in range(i-1, left-1, -1):
arr[j+1] = arr[j]
arr[left] = key
return arr
C++基础版本(完整版)
#include
using namespace std;
//折半插入排序
void InsertSort(int A[], int n){//n为下标
int i,j,low,mid,high;
for(i = 2;i <= n;i++){
A[0] = A[i];
low = 1; high = i-1;//查找的是有序序列所以high不能直接指向最后一个元素
while(low <= high)//相等的时候需要再比一次,为确保算法的稳定性
{
mid = (low + high) / 2;
if(A[mid] > A[0]){
high = mid - 1;
}
else{
low = mid + 1;
}
}
for(j = i-1;j >= high+1;j--){
//将找好位置的地方之后的元素统统后移,空出插入位置
A[j+1] = A[j];
}
A[high+1] = A[0];
}
}
int main(){
int n;cin>>n;
int arr[n];
for(int i=1;i<=n;i++){
cin>>arr[i];
}
//函数调用
InsertSort(arr,n);
for(int i=1;i<=n;i++){
cout<
C++升级版本(模板泛型+迭代器)
#include
template
void binaryInsertionSort(std::vector& arr) {
for (auto it = arr.begin()+1; it != arr.end(); ++it) {
T val = *it;
auto pos = std::upper_bound(arr.begin(), it, val);
std::move_backward(pos, it, it+1);
*pos = val;
}
}
代码亮点:
std::upper_bound
实现二分查找数据规模 | 传统插入排序(ms) | 折半插入排序(ms) | 优化比例 |
---|---|---|---|
1,000 | 2.3 | 1.7 | 26%↑ |
10,000 | 215 | 158 | 27%↑ |
100,000 | 24,500 | 19,200 | 22%↑ |
测试环境:
HYBRID_THRESHOLD = 20 # 通过实验确定最佳值
if right - left < HYBRID_THRESHOLD:
linear_search(arr, left, right, key)
推荐场景 | 不适用场景 |
---|---|
实时数据流处理(如日志排序) | 超大规模数据(n>10^6) |
内存敏感型嵌入式设备 | 需要稳定O(n log n)的场景 |
混合排序算法的基础组件 | GPU加速环境 |
std::move_backward
(C++)减少拷贝开销