关于二分查找算法

来源:互联网 发布:java支付工单状态流程 编辑:程序博客网 时间:2024/05/16 08:11

二分查找算法

一、问题描述;

二分查找法也称为折半查找,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。

二、代码;

1、递归实现

//二分查找(递归实现)#include<stdio.h>void ERSearch(int a[], int l, int r, int x);int main(){int i, a[100], x;printf("Please input x:\n");scanf("%d", &x);for(i = 0; i < 100; i++){a[i] = i + 1;}ERSearch(a, 0, 99, x);return 0;}void ERSearch(int a[], int l, int r, int x){int m;//中间元素的下标if(l > r && r > 0){//递归结束条件,数组长度要大于零printf("Not found!\n");}else{m = (r + l) / 2;if (a[m] > x){ERSearch(a, l, m - 1, x);}else{// 小于或者等于的情况if(a[m] < x){ERSearch(a, m + 1, r, x);}else{//等于的情况,即找到了printf("Find it!\n");}}}}
2、非递归实现;

<span style="color:#ff0000;">//二分查找(非递归实现)#include<stdio.h>void ERSearch(int a[], int n, int x);int main(){int i, a[100], x;printf("Please input x:\n");scanf("%d", &x);for(i = 0; i < 100; i++){a[i] = i + 1;}ERSearch(a, 99, x);return 0;}void ERSearch(int a[], int n, int x){int i, j, m, flag = 1;//fiag用来说明找到没有if(n > 0){for (i = 0, j = n; j >= i && flag;){//加上flag,找到就退出m = (i + j) / 2;if (a[m] > x){j = m - 1;}else{if (a[m] < x){i = m + 1;}else{printf("Find it!\n");flag = 0;}}}if (flag){printf("Not find!\n");}}}</span>
三、心得总结;

在编写时,除了知道它的基本思想之外,还要特别注意的是折半的时候对该数进行加减一操作,否则,容易陷入无休止的计算中。


0 0