插入排序中要完成两种操作,找元素的插入位置 和 移动元素
折半插入排序,查找插入位置用折半查找,与直接插入排序比较看,减少了元素的比较次数,但没有改变元素的移动次数。
#include <iostream>
using namespace std;
//对于顺序表,折半插入排序
void InsertSort(int a[], int n)
{
int i, j, low, high, mid;
for (i = 2; i<n; i++)
{
a[0] = a[i]; //用a[0]记录保存待查入元素
low = 1; high = i - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (a[mid]>a[0])
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >= high + 1; --j)
{
a[j + 1] = a[j];//移动元素
}
a[high + 1] = a[0]; //赋值
}
}
int main(int argc, char const *argv[])
{
int a[8] = { 0,4,1,12,43,2,8,10 };
int i;
InsertSort(a, 8);
for (i = 1; i<8; ++i)
{
cout << a[i] << endl;
}
system("pause"); //在vs上运行,需要加,不然会运行,之后闪退
return 0;
}