改进的二分查找
2012-12-07 11:31
274 查看
//改进的二分查找
//如果待查找的数组中存在相同元素,则返回相同元素第一个的下标
/*
递归算法
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;
}
}
/*博主寄语:如若发现错误,望指出,谢谢*/
//如果待查找的数组中存在相同元素,则返回相同元素第一个的下标
/*
递归算法
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;
}
}
/*博主寄语:如若发现错误,望指出,谢谢*/
相关文章推荐
- 二分查找的改进 差值查找(low<=high,这与快排low<high)
- 对二分查找的改进
- 插值查找(二分查找的改进)
- 二分查找的小改进
- 二分查找的改进--差值查找
- 二分查找及改进
- 二分查找的一点改进优化
- 二分查找的改进:插值查找
- 改进二分查找
- 插入排序的改进版本(二分查找)
- 黑马程序员_JAVA中的二分查找(课堂笔记)
- 【newCoder】2016校招真题在线编程 二分查找
- 写一个函数,实现一个整形有序数组的二分查找
- hdu 5101 单调+二分查找
- 二分查找
- C源码@数据结构与算法->二分查找树(Binary Search Tree)
- 【每日算法】开篇&二分查找
- 查找算法(二叉搜索树查找,二分查找,hash查找)
- 二分查找
- hdu 4004(The Frog's Games) 二分查找