简介
待排序列L[1…n]中,执行如下操作:
- 查找出L(i)在L[1…i-1]中的插入位置k
- 将L[k…i-1]中的所有元素向后移动一个位置
- 将L(i)复制到L(k)
时间复杂度:
- 最好情况:O(n)
- 平均情况:O(n2)
- 最坏情况:O(n2)
空间复杂度: O(1)
是否稳定:是
与直接插入的区别:
折半插入是先进行查找待排数的位置,再将其待插入元素后面的元素进行统一移动;
而直接插入是边比较边移动元素。
代码
#include <iostream>
using namespace std;
void InsertSort(int a[], int len)
{
int low, hight, mid;
int i, j;
int temp;
for(i = 1; i < len; i++)
{
temp = a[i];
low = 0;
hight = i-1;
while(low<=hight)
{
mid = (low + hight)/2;
if(a[mid] > temp)
{
hight = mid - 1;
}
else
{
low = mid + 1;
}
}
for(j = i-1; j >= hight+1; j--)
{
a[j+1] = a[j];
}
a[hight+1] = temp;
}
}
int main()
{
int a[255];
int len;
cin >> len;
for(int i = 0; i < len; i++)
{
cin >> a[i];
}
InsertSort(a, len);
for(int i = 0; i < len; i++)
{
cout << a[i] << " ";
}
return 0;
}