二分查找



/c++实现/

#include <iostream>

using namespace std;

/*
 *二分查找思想:1、数组从小到大排序;2、查找的key每次和中间数比较,如果key小于mid
 查找mid左侧的数组部分;如果key大于mid,则查找mid右侧的数组部分;如果相等,则直接返回mid。
 
 输入:排序数组-array,数组大小-aSize,查找值-key
 返回:返回数组中的相应位置,否则返回-1
 */
//非递归查找
int BinarySearch(int *array, int aSize, int key)
{
    if ( array == NULL || aSize == 0 )
        return -1;
    int low = 0;
    int high = aSize - 1;
    int mid = 0;
    
    while ( low <= high )
    {
        mid = (low + high )/2;
        cout<<"BinarySearch"<<mid<<endl;
        
        if ( array[mid] < key)
            low = mid + 1;
        else if ( array[mid] > key )
            high = mid - 1;
        else
            return mid;
    }
    return -1;
}
//递归
int BinarySearchRecursive(int *array, int low, int high, int key)
{
    if ( low > high )
        return -1;
    int mid = ( low + high )/2;
    cout<<"BinarySearchRecursive"<<mid<<endl;
    
    if ( array[mid] == key )
        return mid;
    else if ( array[mid] < key )
        return BinarySearchRecursive(array, mid+1, high, key);
    else
        return BinarySearchRecursive(array, low, mid-1, key);
}

int main()
{
    int array[11]={2,24,50,100,123,213,300,500,730,800,950};
    //    for (int i=0; i<10; i++)
    //        array[i] += i;
    
    cout<<"No recursive:"<<endl;
    cout<<"position:"<<BinarySearch(array, 11, 123)<<endl;
    cout<<"recursive:"<<endl;
    cout<<"position:"<<BinarySearchRecursive(array, 0, 10, 123)<<endl;
    
    return 0;
}

///python实现/

def BinarySearch( lea,key):
    if lea==None or len(lea)==0:
        return -1
    low =0
    high=len(lea)-1
    while low <= high:
        mid = int((high+low)/2)
        print ("BinarySearch:%d" %mid)
        if lea[mid] <key:
            low =mid +1
        elif lea[mid]>key:
            high =mid -1
        else:
            return mid
    return -1

if __name__=='__main__':
    mylea = [10,11,20,34,57,59,422,700,984,10123]
    a = BinarySearch(mylea,422)
    print (a)


///java实现/

package javaapplication2;
/**
 *
 * @author allenboy
 */
public class testjava {
    public static int sreak(int[] arr,int key){
        if(arr.length==0||arr==null){
            return -1;
        }
        int low =0;
        int hight = arr.length-1;
        while(low<=hight){
            int mid = (low + hight)>>1;
            int num = arr[mid];
            if(key==num){
                return mid;
            }if(key>num){
                low=mid+1;
            }
             else{
                hight=mid-1;
            }
        }
        return -1;
    }
    public static void main(String[] args)
    {
            int[] myarr = new int[]{1,3,5,6,7,8,10};
            int num = sreak(myarr,7);
            System.out.println(num);
        }

}




/oc 实现/

#import <Foundation/Foundation.h>

@interface search : NSObject
+(int)BinarySearch:(NSArray*)arr target:(int)target;
@end
//
//  search.m
//  allen
//
//  Created by Allenboy on 2018/1/16.
//  Copyright © 2018年 Allenboy. All rights reserved.
//

#import "search.h"

@implementation search
+(int)BinarySearch:(NSArray *)arr target:(int)target
{
    if (!arr.count) {
        return -1;
    }
    unsigned int  low = 0;
    unsigned int  high = arr.count - 1;
    
    while (low<=high) {
        unsigned int mid = low + ((high-low)>>1); //防止加法溢出
        int  num =(int)[arr objectAtIndex:mid];
        if (target == num) {
            return mid;
        }else if(num > target)
        {
            high = mid -1;
        }else{
            low = mid +1;
        }
    }
    return -1;
}
@end

//
//  main.m
//  allen
//
//  Created by Allenboy on 2018/1/15.
//  Copyright © 2018年 Allenboy. All rights reserved.
//
//
#import <Foundation/Foundation.h>
#import "search.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
//        search* se  =[[search alloc] init];
        NSArray *arr = @[@1,@4,@5,@8,@12,@32,@45];
        int result = [search BinarySearch:arr target:@4];
        NSLog(@"%d",result);
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C-haidragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值