直接插入需要在有序数据一个个查找,找到插入位置,然后插入, 效率较慢;折半插入是使用二分查找在有序区间查找插入位置,减少查找量。
总的来说,折半插入排序就是折半查找+插入排序。关于直接插入排序可以看这一篇[ 文章 ][1]。
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <vector>
#include <algorithm>
#include "dbg.h"
using namespace std;
void binaryInsetionSort(int R[], int len)
{
// 假设初始有序序列为R[0]
for (int i = 1; i < len; i++)
{
int temp = R[i];
int low = 0, high = i - 1; // 设置折半查找范围
while (low <= high) // 开始在有序序列中进行折半查找,
//low为最终查找到的插入位置
{
int mid = low + (high - low) / 2;
if (R[mid] > temp)
high = mid - 1;
else
low = mid + 1;
}
for (int j = i - 1; j >= low; j--)
R[j + 1] = R[j]; // 后移,将插入位置空出来
R[low] = temp; // 插入元素
}
}
int main(int argc, char *argv[])
{
int R[] = {1, 3, 2, 18, 3, 28, 23, 38, 7, 8};
cout << "Before sorting = " << endl;
dbg(R);
int len = sizeof(R) / sizeof(R[0]);
cout << "After sorting = " << endl;
binaryInsetionSort(R, len);
dbg(R);
return 0;
}
运行结果
时间复杂度 = O(n^2)
[1] = https://ongoing-z.github.io/blog/posts/2020/10/insertion-sort.html