二分查找
//
// 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);
}
}