#include <iostream>
using namespace std;
/*
折半插入排序(Binary Insertion Sort)是一种插入排序算法,
通过不断地将数据元素插入到合适的位置进行排序,
在寻找插入点时,利用了折半查找
基本思想:顺序地把待排序的序列中的各个元素按照其关键字的大小,
通过这本查找插入到已经排序的序列的适当位置
时间复杂度O(n^2),稳定的排序方法
*/
void binary_insertion_sort(int arr[], int len) {
int i, j, temp, m, low, high;
for (i = 1; i < len; i++) {
temp = arr[i];//现在要插入第i个元素到前i个元素中
low = 0; high = i - 1;
while (low <= high) {
m = (low + high) / 2;//取前i个元素的中间位置
if (arr[m] > temp) {
high = m - 1;//当中间元素比要插入的元素要大,从前半部分继续查找
}
else {
low = m + 1;//从后半部分继续找
}
}
//由于前i个元素是有序的,当我们找到要插入的位置的时候
//我们就需要把该位置之后的元素依次后移
for (j = i - 1; j >= high + 1; j--) {
arr[j + 1] = arr[j];
}
cout <<temp<<"插入的位置"<< high+1 << endl;
arr[high + 1] = temp;
}
}
int main()
{
int i;
int array[8] = { 8, 5, 4, 3, 2, 1, 6, 7 };
binary_insertion_sort(array, 8);
for (int i = 0; i < 8; i++) {
cout << array[i] << endl;
}
return 0;
}
结果: