对于要查找的数据已经排序,此时仍然可以使用顺序查找法来进行查找,但是此时有更加简便的方法,
那就是“折半查找法(Binary Search)”。
折半查找法的实现步骤如下:
假设数组的上下范围分别为low和high,则此时中间元素是(low + hihg) / 2。在进行查找时。
1.如果查找关键码小于数组的中间元素,则关键码在数据数组的前半部。
2.如果查找关键码大于数组的中间元素,则关键码在数据数组的后半部。
3.如果查找关键码等于数组的中间元素,则中间元素就是查找的值。
对于如下的例子:
1, 2, 3, 4, 5, 6, 7, 8, 9
若要查找的整数是8,则
第一步是与中间的元素索引4的值5进行比较。因为8>5,所以在后半段进行查找,
后半段如下 6, 7, 8, 9
第二步是与中间的元素索引是6的值7进行比较,因为8>7,所以继续在后半段进行查找,
后半段如下:8,9
那就是“折半查找法(Binary Search)”。
折半查找法的实现步骤如下:
假设数组的上下范围分别为low和high,则此时中间元素是(low + hihg) / 2。在进行查找时。
1.如果查找关键码小于数组的中间元素,则关键码在数据数组的前半部。
2.如果查找关键码大于数组的中间元素,则关键码在数据数组的后半部。
3.如果查找关键码等于数组的中间元素,则中间元素就是查找的值。
对于如下的例子:
1, 2, 3, 4, 5, 6, 7, 8, 9
若要查找的整数是8,则
第一步是与中间的元素索引4的值5进行比较。因为8>5,所以在后半段进行查找,
后半段如下 6, 7, 8, 9
第二步是与中间的元素索引是6的值7进行比较,因为8>7,所以继续在后半段进行查找,
后半段如下:8,9
第三步,此时的中间元素的索引是7的值8,即为我们我查找的值。
/*
File Name: Binary Search
Data Time:
Anthor:
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 21
typedef struct element
{
int key;
}record;
record data[AMX] = {
2, 5, 7, 9, 17, 21, 25,
33, 46,89,100, 121, 127, 139,
237, 279, 302, 356, 455, 467, 500};
//
int binary_find(int key, int low, int high)
{
int mid;
if(low == high)
{
if(data[low].key == key)
return low;
else
return -1;
}
else
{
mid = (low + high) / 2;
if(mid == low);
mid++;
if(key < data[mid].key)
return binary_find(key, low, mid - 1);
else
return binary_find(key, mid, high);
}
}
//Binary Search
int binary_search(int key)
{
return binary_find(key, 0, MAX - 1);
}
int main(int argc, char** argv)
{
int found;
int value;
while(1)
{
printf("\n请输入查找值(0-500) ==> ");
scanf("%d", &value);
if(value != -1)
{
found = binary_search(value);
if(found != -1)
{
printf("找到查找值: %d[%d]\n", value, found);
}
else
{
printf("没有哦找到查找值: %d\n", value);
}
}
else
exit(1);
}
system("pause");
return 0;
}
此处是使用递归的方式实现的折半查找。
以下可以通过使用非递归的方式实现折半查找
代码实现如下:
/*
File Name: Binary Search
Data Time:
Anthor:
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 21
typedef struct element
{
int key;
}record;
record data[MAX] = {
2, 5, 7, 9, 17, 21, 25,
33, 46,89,100, 121, 127, 139,
237, 279, 302, 356, 455, 467, 500};
int binary_search(int key, int low, int high)
{
int mid;
while(low <= high)
{
mid = (low + high) / 2;
if(key < data[mid].key)
high = mid - 1;
else
if(key > data[mid].key)
low = mid + 1;
else
return mid;
}
return -1;
}
int main(int argc, char** argv)
{
int found;
int value;
while(1)
{
printf("\n请输入查找值(0-500) ==> ");
scanf("%d", &value);
if(value != -1)
{
found = binary_search(value, 0, MAX - 1);
if(found != -1)
{
printf("找到查找值: %d[%d]\n", value, found);
}
else
{
printf("没有哦找到查找值: %d\n", value);
}
}
else
exit(1);
}
system("pause");
return 0;
}