二分查找怎么找,快速查找和二分查找
归纳的优点:比较次数少,搜索速度快,平均性能好。
缺点:要搜索的表是有序表,插入和删除比较困难。
时间复杂度:O(logN)
实际场景:有序阵列
假设思路表按升序排列,将中间元素与待检元素进行比较,如果中间元素与待检元素相等,则找到中间元素;如果小于,就找前半段;不然下半年再找。
如前所述,二分搜索法实际上主要针对搜索有序数组。他的比较次数少,查找速度快,这是我们学习C语言前期需要掌握的技能。接下来,我用绘图的形式给大家解释一下:
首先,让我简单介绍一下二分搜索法,也就是说,我发现了一个中间值。如果这个中间值大于我要找的数,那么这个中间值右边的所有数都可以排除。如果它比我要找的数字小,那么排除中间值左边的数字。接下来画一张图来说明:
让我们把这个数组命名为arr[10]
看图中的值,可以发现这个数组的中间值是5和6,不过不用担心,因为(0 9)/2=4在电脑里。
所以他的中间值是arr[4],也就是带有元素5的值,
可以看到,我们的中值是4,对应的元素是5。我用黑圈圈了起来。因为是有序的,下标4的右边可以完全排除。接下来,我们只需要找到4的左边。当然,因为已经判断出4,所以也可以排除4对应的元素5。那么,我们接下来搜索的范围就是下标0到3的范围,也就是{1,2,3,4}。
接下来,搜索范围在棕色框中。被搜索的下标为1的元素对应于被圈起来的元素2。然后你可以发现2小于要搜索的数字,那么下标1的左边,包括带下标1的值都可以忽略,下一个范围缩小到{3,4 };
而我们的left=median 1,因为不需要包含下标1的元素,
再看,因为left=2,所以(2 ^ 3)/2=2,我们找到了下标为2的元素,也就是我们要找的数字,于是我们实现了二分搜索法,然后给你打印代码。
# include assert . h int tow fen(int * arr,int sz,int n){ if(SZ=0){ return-1;} assert(arr);int left=0;int right=SZ-1;while(left=right){ int sum=(left right)/2;if(n arr[sum]){ left=sum 1;} else if(n arr[sum]){ right=sum-1;} else {返回sum} } return-1;}int main(){ int arr[10]={ 1,2,3,4,5,6,7,8,9,10 };int SZ=sizeof(arr)/sizeof(arr[0]);Printf(请输入要查找的数字\ n );int n=0;scanf(%d ,int ret=towfen(arr,sz,n);如果(ret!=-1) {printf (found,下标是%d ,ret);} else printf(未找到\ n );返回0;}如你所见,我在图中告诉你的左=中值1,右=中值-1都用上了。我们三次后才找到这十个数的数组,效率可以说是更快了。这次二分搜索法的方法就介绍到这里,希望得到大家的免费好评。你的赞是我更新博客的动力!
,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。