### 思路
折半插入排序是一种改进的插入排序算法,通过二分查找来确定插入位置,从而减少比较次数。每次插入时,先用二分查找找到插入位置,然后将元素插入到正确的位置。
### 伪代码
1. 读取输入的待排序关键字个数`n`。
2. 读取`n`个待排序关键字并存储在数组中。
3. 对数组进行折半插入排序:
- 从第二个元素开始,依次对每个元素进行插入排序。
- 使用二分查找确定当前元素的插入位置。
- 将当前元素插入到正确的位置。
- 输出当前排序结果。
4. 重复步骤3直到排序完成。
### C++代码
#include <iostream>
#include <vector>
using namespace std;
// 二分查找插入位置
int binarySearch(const vector<int>& arr, int item, int low, int high) {
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == item)
return mid + 1;
else if (arr[mid] < item)
low = mid + 1;
else
high = mid - 1;
}
return low;
}
// 折半插入排序
void binaryInsertionSort(vector<int>& arr) {
int n = arr.size();
for (int i = 1; i < n; ++i) {
int key = arr[i];
int j = i - 1;
// 找到插入位置
int loc = binarySearch(arr, key, 0, j);
// 移动元素
while (j >= loc) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
// 输出当前排序结果
for (int k = 0; k < n; ++k) {
if (k > 0) cout << " ";
cout << arr[k];
}
cout << endl;
}
}
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
binaryInsertionSort(arr);
return 0;
}
### 总结
折半插入排序通过二分查找来确定插入位置,从而减少了比较次数。每次插入时,先用二分查找找到插入位置,然后将元素插入到正确的位置。每趟排序后输出当前排序结果。