二分查找

//

//  main.c

//  SearchBin

//

//  Created by PSH_Chen_Tao on 10/28/13.

//  Copyright (c) 2013 wolfman. All rights reserved.

//

 

#include <stdio.h>

int search_bin(int arr[],int key ,int n);

int search_bin1(int arr[],int key ,int n);

void search_bin2(int arr[],int key,int n,int p[2]);

void search_bin3(int arr[],int key,int n,int p[2]);

int main(int argc, const char * argv[])

{

    int arr[] = {12,12,12,12,12,12,12,12,12,56,89,100,121,153,189};

 

    int ret = search_bin(arr,12,sizeof(arr)/sizeof(int));

    printf("the ret is %d\n\n",ret);

    

    int ret1 = search_bin1(arr,90,sizeof(arr)/sizeof(int));

    printf("the ret is %d\n\n",ret1);

    

    int p[2] = {};

    search_bin2(arr,90,sizeof(arr)/sizeof(int),p);

    printf("\n\n p[0] = %d and p[1] == %d\n\n",p[0],p[1]);

    

    

   

    search_bin3(arr,90,sizeof(arr)/sizeof(int),p);

    printf("\n\n p[0] = %d and p[1] == %d\n\n",p[0],p[1]);

    return 0;

}

 

 

int search_bin(int arr[],int key ,int n){

    if (arr == NULL) {

        printf("arr == NULL\n");

        return  -1;

    }

    int low = 0;

    int high = n - 1;

    int mid = -1;

    int flag = -1;

    while (low <= high) {

        mid = (low + high)/2;

        if (arr[mid] == key) {

            flag = mid;

            high = mid - 1;

        }

        else if (arr[mid] < key){

            low = mid + 1;

        }else{

            high = mid - 1;

        }

    }

    

    if (flag == -1) {

        return -1;

    }else{

        return flag;

    }

}

 

int search_bin1(int arr[],int key ,int n){

    if (arr == NULL) {

        printf("arr == NULL\n");

        return  -1;

    }

    int low = 0;

    int high = n - 1;

    int mid = -1;

    while (low <= high) {

        mid = (low + high)/2;

        if (arr[mid] == key) {

          

            while (arr[mid] == key && mid >= 0) {

                mid --;

            }

            return mid+1;

        }

        else if (arr[mid] < key){

            low = mid + 1;

        }else{

            high = mid - 1;

        }

    }

    

    return -1;

}

 

 

void search_bin2(int arr[],int key,int n,int p[2]){

    if (arr == NULL) {

        printf("arr == NULL \n");

    }

    

    int low = 0;

    int high = n - 1;

    int flag = -1;

    int mid = -1;

    while (low <= high) {

        mid = (low + high)/2;

        if (arr[mid] == key) {

            flag = mid;

            break;

        }

        else if (arr[mid] > key){

            high = mid - 1;

        }

        else{

            low = mid + 1;

        }

    }

    if (flag == -1) {

        

        if (arr[mid] > key ) {

            p[0] = mid - 1;

            p[1] =  mid;

        }else{

            p[0] = mid;

            p[1] = mid + 1;

        }

        

    }else{

        p[0] = p[1] = flag;

    }

}

 

void search_bin3(int arr[],int key,int n,int p[2]){

    if (arr == NULL) {

        printf("arr == NULL \n");

    }

    

    int *low = arr;

    int *high = arr + n-1;

    int *mid = NULL;

    int *flag = NULL;

    while (low <= high) {

        mid = low + (high - low)/2;

        if (*mid == key) {

            flag = mid;

            break;

        }

        else if (*mid > key){

            high = mid -1;

        }else{

            low = mid + 1;

        }

    }

    

    if (flag == NULL) {

        if (*mid > key) {

            p[0] = (int)(mid - arr) - 1;

            p[1] = (int)(mid - arr);

        }else{

            p[0] = (int)(mid - arr) ;

            p[1] = (int)(mid - arr) + 1;

        }

        

    }else{

        p[0] = p[1] = (int)(flag - arr);

    }

}

 

posted @ 2013-10-31 10:17  Forty_two  阅读(154)  评论(0)    收藏  举报