#define listNum 100 //定义序列长度
main()
{
int *olist; //存放源序列
int *nlist; //存放新序列
//源序列输入
binaryInsert(nlist,olist,0);
}
void binayInsert(int *nlist,int *olist,num)
{
int *account=0;
if (num<listNum)
{
newIdx=binarySearch(nlist,0,num,olist[num],account); //二分查找在nlist中olist[num]插入的位置
//在nlist的newIdx位置插入元素olist[num]
binaryInsert(nlist,olist,++num);
} else {
return 0;
}
}
int binarySearch(nlist,sIdx,eIdx,n,account)
{
//递归调用时,account都+1,最后可得到二分查找的比较次数
int mIdx=(sIdx+eIdx)/2;
if (sIdx<eIdx)
{
(*account)++;
if (n<nlist[mIdx])
{
return binarySearch(nlist,sIdx,mIdx-1,n,account);
} else if(n>nlist[mIdx]) {
return binarySearch(nlist,mIdx+1,eIdx,n,account);
} else {
return mIdx;
}
} else {
return sIdx;
}
}
由于没调试过,可能存在细节上的错误,但大致思路就是如上
另外,个人认为,插入排序的时间复杂度主要是在插入时的数组移动阶段,其整个时间复杂度是o(n^2),
即使你在搜索位置时用了折半查找也不能降低其时间复杂度。而用折半查找,你的代码可读性就要比顺序查找插入位置的代码的可读性降低了。
[此贴子已经被作者于2007-1-2 12:49:09编辑过]