改进的二分查找

//改进的二分查找
//如果待查找的数组中存在相同元素,则返回相同元素第一个的下标
/*
递归算法
int searchB1(int A[], int low, int high, int data);
非递归算法
int searchB2(int A[], int len, int data);
*/
#include<stdio.h>
#include<string.h>
#define Len 25
//递归算法
int searchB1(int A[], int low, int high, int data);
//非递归算法
int searchB2(int A[], int len, int data);


void main()
{
         int i;
         int len = 0;
         int data;          //要查找的字符
         int result = 0;
         int A[] = {1,3,3,3,3,6,7,8,9};
         len = sizeof(A) / sizeof(int);
         printf("output the primary data:");
         for(i = 0; i < len; i++)
         {
              if( i % 5 == 0)
                   printf("\n");
              printf("A[%d]:%d\t",i,A[i]);
         }
         printf("\nintput the searched char:");
         scanf("%d",&data);

 
         result = searchB1(A,0,len-1,data);
         printf("recursion search.\n");
         if( result == -1 )
         {
              printf("Sorry,no this char.\n");
         }
         else
         {
              printf("the char is %d.\n",A[result]);
              printf("the index of the char in Array is %d.\n",result);
         }
 


         result = searchB2(A,len,data);
         printf("unrecursion search.\n");
         if( result == -1 )
         {
             printf("Sorry,no this char.\n");
         }
         else
         {
              printf("the char is %d.\n",A[result]);
              printf("the index of the char in Array is %d.\n",result);
         }
 

 
}

 

//非递归算法
int searchB2(int A[], int len, int data)
{
         int low = 0;
         int high = len - 1;
         int mid = 0;
         while( low <= high )
         {
              mid = ( low + high ) / 2;
              if( A[mid] == data )
              {
                   if(low == high )
                       return mid;
                   else
                   {
                         if( A[mid - 1] == data )
                         {//A[mid]和A[mid-1]都等于data,则继续查找
                              high = mid - 1;
                          }
                          else
                          {
                               return mid;
                          }
                    }
              }
             else if( A[mid] < data )
             {
                     low = mid + 1;
             }
             else
             {
                     high = mid - 1;
             }
       }//end while
     //没有返回-1
     return -1;
}

 

int searchB1(int A[], int low, int high, int data)
{
         if( low <= high )
         {
              int mid = ( low + high ) / 2;    //low+((high-low)/2)可能更严谨
              if( A[mid] == data )
              {
                    if(low == high )
                          return mid;
                    else
                   {
                        if( A[mid - 1] == data )
                       {//A[mid]和A[mid-1]都等于data,则继续查找
                             high = mid - 1;
                             return searchB1(A,low,high,data);
                        }
                        else
                        {
                            return mid;
                         }
                     }
              }
             else if( A[mid] < data )
             {
                   low = mid + 1;
                   return searchB1(A,low,high,data);
              }
              else
              {
                    high = mid - 1;
                    return searchB1(A,low,high,data);
               }
         }
        else
        { //没有返回-1
              return -1;
        }
 
}

 

/*博主寄语:如若发现错误,望指出,谢谢*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值