11个中最大的10个数字

有一个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");

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值