/*定义*/
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int BOOLEAN;
typedef int Status;
typedef int KeyType;
typedef struct
{
KeyType key;
//others members;
}RcdType;
typedef struct
{
RcdType *rcd;
int length;
}RcdList;
①二分查找递归算法
/*recursive function*/
int BinarySearch(RcdType rcd[], int key, int low, int high)
{
if (rcd == NULL || low <= 0 || high < low) return -1;
int mid = (low + high) / 2;
if (rcd[mid].key == key) return mid;
if (key < rcd[mid].key) return BinarySearch(rcd, key, low, mid - 1);
else return BinarySearch(rcd, key, mid + 1, high);
}
②二分查找非递归算法
/*non_recursive function*/
int BinarySearch2(RcdType rcd[], int key, int low, int high)
{
if (rcd == NULL || low <= 0 || high < low) return -1;
int mid;
while (high >= low) {
mid = (low + high) / 2;
if (rcd[mid].key == key) return mid;
if (rcd[mid].key > key) high = mid - 1;
else low = mid + 1;
}
return -1;
}
Status InitRcdList(RcdList &L, KeyType key[], int n)
{
if (n <= 0) return ERROR;
L.rcd = (RcdType*)malloc((n + 1)*sizeof(RcdType));
if (L.rcd == NULL) return ERROR;
L.length = n;
for (int i = 1; i <= n; i++)
L.rcd[i].key = key[i - 1];
return OK;
}
void PrintRcdList(RcdList list)
{
for (int i = 1; i <= list.length; i++)
printf("%d ", list.rcd[i].key);
printf("\n");
}
int main()
{
//test code
KeyType key[] = { 6, 10, 20, 49, 51, 69, 79, 82, 88, 94 };
RcdList list;
InitRcdList(list, key, 10);
PrintRcdList(list);
int location = BinarySearch2(list.rcd, 49, 1, 10);
if (location == -1) printf("It's not exist\n");
else printf("location : %d\n", location);
system("pause");
return 0;
}