数据结构之折半查找法(Binary Search)

来源:互联网 发布:mynba2k18等待网络 编辑:程序博客网 时间:2024/06/10 11:05
对于要查找的数据已经排序,此时仍然可以使用顺序查找法来进行查找,但是此时有更加简便的方法,
那就是“折半查找法(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 SearchData Time:Anthor:*/#include <stdio.h>#include <stdlib.h>#define MAX 21typedef 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;elsereturn -1;}else{mid = (low + high) / 2;if(mid == low);mid++;if(key < data[mid].key)return binary_find(key, low, mid - 1);elsereturn binary_find(key, mid, high);}}//Binary Searchint 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);}}elseexit(1);}system("pause");return 0;}

此处是使用递归的方式实现的折半查找。

以下可以通过使用非递归的方式实现折半查找

代码实现如下:

/*File Name: Binary SearchData Time:Anthor:*/#include <stdio.h>#include <stdlib.h>#define MAX 21typedef 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;elseif(key > data[mid].key)low = mid + 1;elsereturn 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);}}elseexit(1);}system("pause");return 0;}


原创粉丝点击