`
synchronized_lala
  • 浏览: 39897 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

二分插入排序

阅读更多

二分(折半)插入排序基本思想:设在数据表中有一个元素序列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;
}
 
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics