二分(折半)插入排序基本思想:设在数据表中有一个元素序列v[0],v[1],v[2]......v[n].其中v[0],v[1],v[2]......v[i-1]是已经排好序的元素。在插入v[i]。利用折半搜索寻找v[i]的插入位置。
二分插入排序是一种稳定的排序。当n较大时,总排序码比较次数比直接插入排序的最差情况好得多,但比最好情况要差,所元素初始序列已经按排序码接近有序时,直接插入排序比二分插入排序比较次数少。二分插入排序元素移动次数与直接插入排序相同,依赖于元素初始序列。
#include<iostream>
#include<cstring>
using namespace std;
int const ic_limit = 100002;
void vInputData(int &iNum,int iArr[]);
void BinaryInsertSort(int iArr[],int iLeft,int iRight);
void vPrintAns(int iNum,int iArr[]);
int main()
{
int iNum;
int iArr[ic_limit];
memset(iArr,0,sizeof(iArr));
vInputData(iNum,iArr);
BinaryInsertSort(iArr,1,iNum);
vPrintAns(iNum,iArr);
return 0;
}
void vInputData(int &iNum,int iArr[])
{
cin >> iNum;
for(int i=1; i<=iNum; i++)
{
cin >> iArr[i];
}
}
void BinaryInsertSort(int iArr[],int iLeft,int iRight)
{
int iFo;
int iTo;
int iMid;
int iTemp;
for(int i=2; i<=iRight; i++)
{
iFo = 1;
iTo = i-1;
iTemp = iArr[i];
while(iFo <= iTo)//确定插入位置
{
iMid = (iFo + iTo) / 2;
if(iArr[i] < iArr[iMid])
{
iTo = iMid - 1;
}
else
{
iFo = iMid + 1;
}
}
for(int j=i-1; j>=iFo; j--)//iFo == iTo == iMid
{
iArr[j+1] = iArr[j];
}
iArr[iFo] = iTemp;
}
}
void vPrintAns(int iNum,int iArr[])
{
for(int i=1; i<iNum; i++)
{
cout << iArr[i] << " ";
}
cout << iArr[iNum] << endl;
}