折半查找法仅适用于对已有顺序的数组、数据进行操作!!!(从小到大)自我总结:折半查找法就是相当于(通过改变low或high的大小)把中间位置指到了key那个数那里,所以mid应该处于循环里面,即mid=(high+low)/2。注意:low,mid,high都要与下标绑定,也就是说它们就是下标。且循环条件是:high>=low.
同时注意:⑴若原来数组是由小到大排列的则:
1
2
3
4
5
|
mid=(high+low)/2; if (key<a[mid]) //说明要找的值在左边 high=mid-1; else if (key>a[mid]) //说明要找的值在mid右边 low=mid+1; //最小值的位置往右进一位 |
㈡若原来数组是由大到小排列的则:
1
2
3
4
5
|
mid=(high+low)/2; if (key>a[mid]) //注意是由大到小排列 ,所以此时key在a【mid】 左边,故high=mid-1 ; high=mid-1; else if (key<a[mid]) //注意是由大到小排列,所以此时key在a【mid】右边,故low=mid+1; low=mid+1; |
当然在下面这个代码中,也可以用选择排序法和冒泡法来对任意数组进行排序,然后在应用此函数,保证折半查找法的前提是排好序了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#include<stdio.h> void zb( int key, int a[], int n) //key表示要找的数,a表示数组,n表示数组元素个数 { int i,high,low,mid; int count1=0,count=0; low=0; high=n-1; while (high>=low) //保证右下标不小于左下标 { count++; mid=(high+low)/2; //总的来说变得是中间位置相当于把中间位置移到了key那个数那里,所以mid应该处于循环里面 if (key<a[mid]) //说明key在a【mid】的左半边 ,那么最右边的high下标就可以在下标mid基础上往左进一个单位了 high=mid-1; else if (key>a[mid]) //说明key在a【mid】的右半边 ,那么最左边的low下标就可以在下标mid基础上往右进一个单位了 low=mid+1; if (key==a[mid]) { printf ( "元素找到了!!!\n一共查找了%d次\n它处于a[%d]位置上\na[%d]=%d\n" ,count,mid,mid,key); count1++; break ; } } if (count1==0) printf ( "元素不存在!!!\n" ); } int main () { int key,n,a[100]; int i; void zb( int key, int a[], int n); //声明定义函数 printf ( "请输入数组元素个数:\n" ); scanf ( "%d" ,&n); printf ( "请输入(从小到大)所有数组元素:\n" ); for (i=0;i<n;i++) { scanf ( "%d" ,&a[i]); } printf ( "请输入要查找的数:\n" ); scanf ( "%d" ,&key); zb(key,a,n); printf ( "\n" ); return 0; } |
总结
到此这篇关于C语言折半查找法的文章就介绍到这了,更多相关C语言折半查找法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/m0_56168966/article/details/121390236