有一个10个数nA[10]的有序数组(从小到大),来了第11个数nNum,得出11个中最大的10个数字(排序方式(从小到大)不变),要求比较次数越少越好!
这是采用折半查找算法的程序
当要插入的数字小于第一个或者与有数字相等的时候,就不做插入工作。
void FindNumber()
{
int i,j,Number[10],temp;
int low = 0,high = 10,value;
int num,flag=0;
//随机产生数组
srand((unsigned)(time(NULL)));
for(i=0;i<10;i++)
Number[i] = rand()%100;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(Number[j] > Number[j+1])
{
temp = Number[j];
Number[j] = Number[j+1];
Number[j+1] = temp;
}
}
}
//打印数组
for(i=0,j=0;i<10;i++)
{
j++;
printf("%d/t",Number[i]);
if(j%6 == 5)
printf("/n");
}
//随机产生要插入的数字
num = rand()%100;
printf("/nThe Givened Number is %d",num);
//查找重复数字的位置
if(num <= Number[0])//小于第一个啥都不用干
printf("/nInsert None Number");
else
{
//折半查找
while(1)
{
value = low + ((high - low)/2);
if(Number[value] > num)
high = value;
else if(Number[value] < num)
low = value;
else
{
flag = 1;//表示有相等的情况
break;
}
if(low == high-1)
break;
}
//处理收尾工作(插入要插入的数字)
if(flag != 1)
{
printf("/nInsert Number %d",num);
temp = 0;
for(i=0;i<10;i++)
{
if(i == low)
{
temp = Number[high];
Number[low] = num;
}
else
{
if(i>low)
{
Number[i] = temp;
temp = Number[i+1];
}
else
Number[i] = Number[i+1];
}
}
}
else
printf("/nInsert None Number");
}
//打印数组
printf("/n");
for(i=0,j=0;i<10;i++)
{
j++;
printf("%d/t",Number[i]);
if(j%6 == 5)
printf("/n");
}
printf("/n");
}