DS排序--折半插入排序
时间: 2025-01-21 20:17:17 浏览: 48
### 折半插入排序算法详解
#### 定义与原理
折半插入排序是对直接插入排序的一种优化版本。该算法通过减少关键字之间的比较次数来提高效率,在每次插入新元素时,不是线性扫描已排序的部分,而是使用二分查找法找到合适的插入位置[^3]。
#### 算法特点
- **时间复杂度**:平均情况下为 O(n log n),最坏情况下的时间复杂度仍为 O(n²)。
- **空间复杂度**:O(1),因为只需要常量级别的额外存储空间。
- **稳定性**:稳定排序算法,保持相同元素原有的相对次序不变。
#### 实现逻辑
对于长度为 `n` 的数组,从第二个元素开始遍历至最后一个元素;每轮迭代中,当前待处理的元素被取出并与之前已经排好序的小规模子数组中的元素对比,利用二分查找定位其应放置的位置并完成插入操作。
以下是 C++ 中实现的一个简单例子:
```cpp
void binaryInsertionSort(int arr[], size_t n){
int i, j;
for(i = 1; i < n; ++i){// 遍历整个列表
int key = arr[i];
int left = 0;
int right = i - 1;
/* 使用二分查找确定key应该插入的位置 */
while(left <= right){
int mid = (left + right) / 2;
if(key < arr[mid]){
right = mid - 1;
}
else{
left = mid + 1;
}
}
// 移动较大的元素向右移动一位
for(j = i - 1; j >= left ; --j){
arr[j + 1] = arr[j];
}
// 插入key到正确位置
arr[left] = key;
}
}
```
此函数接收两个参数——一个整型指针指向要排序的数据集以及表示数据集中元素数量的无符号整形变量。它按照上述说明执行折半插入排序,并最终返回原地修改后的有序数组。
阅读全文
相关推荐



















