402v /posts/er-fen-fa-cha-zhao-de-shi-xian-di-gui-and-xun-huan
二分法查找的实现(递归&循环)
#include "stdafx.h"
//////////////////////////////////////////
//二分查找 //
//Author:Kimimaro //
//Date:2010-3-28 //
/////////////////////////////////////////
<!--more-->
typedef int KeyType; //定义关键字类型
//typedef struct //定义数据元素结构
//{
// KeyType key; //关键字域
//}SElemType;
//宏定义关键字比较操作
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b) ((a) <= (b))
//定义表长
#define MAX 5
//----------------静态查找表的顺序存储结构-------------------
typedef struct
{
KeyType *elem;
int length;
}SSTable;
//创建指定长度的静态查找表
int CreatSST(SSTable &S,int n)
{
S.length = n;
S.elem = (KeyType*)malloc(S.length*sizeof(KeyType));
int i = 1;
while(scanf("%d",&(S.elem[i])) != EOF)
{
i++;
}
return 0;
}
//递归二分查找
int binarySearch(SSTable S,KeyType key,int low,int high)
{
if(low > high) return -1;
int mid = (low + high) / 2;
if(EQ(key, S.elem[mid])) return mid;
else if(LT(key, S.elem[mid])) binarySearch(S,key,low,mid - 1);
else binarySearch(S,key,mid + 1,high);
}
//循环二分查找
//int binarySearch(SSTable S,KeyType key)
//{
// int low = 1,high = S.length,mid;
//
// while(low <= high)
// {
// mid = (low + high) / 2;
//
// if(EQ(key,mid)) return mid;
// else if(LT(key,mid)) high = mid - 1;
// else low = mid + 1;
// }
//
// return -1;
//}
int _tmain(int argc, _TCHAR *argv[])
{
SSTable S;
CreatSST(S,MAX);
for(int i = 1;i <= S.length;i++)
{
printf("%d ",S.elem[i]);
if(i == S.length) printf("\n");
}
int key;
printf("Which number do you want to search?\n");
scanf("%d",&key);
int location;
// location = binarySearch(S,key); //循环二分查找
location = binarySearch(S,key,1,S.length); //递归二分查找
char chs = getchar();
printf("The elem is S.elem[%d].\n",location);
char ch = getchar();
return 0;
}
评论 · 0
还没有评论。