大家好,我还是那个爱分享编程知识的博主,同时我也会分享一些有趣的C语言小程序的代码,让你们在编程学习的过程中体验到快乐,并且我致力于在文章中体现编程思想,关注点一点,下期更精彩。
上次,我已经给大家带来了暴力查找数组的具体元素的方法。今天,我将带来了这个程序的优化,话不多说,直接进入正题。我们保留了上一篇《在有序数组找具体某个数字》文章的一丁点代码,而这些代码存在的原因,我已经在《在有序数组找具体某个数字》提到,有需要的可以去看一下,代码如下:
#include<stdio.h>intmain(){int arr []={1,2,3,4,5,6,7,8,9,10};//求元素个数int sz =sizeof(arr)/sizeof(arr[0]);//想要求的元素,这里假设我要求6int k =6;return0;}
我们依然,创建变量left和变量right分别表示第一个元素和最后一个元素的下标,如下:
接下来,我们设置一个变量mid来存储变量left和变量right的平均值。注意,变量mid的类型应设置为整形int,因为变量mid用于arr数组下标的使用,应该为整形类型。我们将下标是变量mid所在的数组元素与我们想要寻找的元素进行比较,推断我们要寻找的元素是否是目前的中间元素,或者是中间元素的之前,或者之后。
变量left和right相加除二保留整数(因为变量mid的类型是整形),得到了整形数字4。
在上面,我们设置的想要寻找的变量k大小是6,也就是下标为5,所以我们将变量k和数组被变量mid指向的元素进行比较,可以得知变量k更大,所以我们的变量k应该在变量mid的右边。接下来,我们的查找范围就变为了变量mid往右边第一个元素到数组的结束,所以我们的变量left就应该来到了变量mid右边的第一个元素(因为此时下标为变量mid的元素不等于变量k,所以变量left直接来到变量mid下标指向的元素的右边第一个元素),所以变量mid应该为变量left加一,然后,我们依然求出变量mid的大小,如下:
同样的道理,我们将变量k和数组被变量mid指向的元素进行比较,可以得知变量mid指向的元素更大,所以我们的变量k应该在变量mid的左边,而且等于或者大于下标为left的元素,所以我们应该将变量right进行调整,即变量right为变量mid减一,如下:
我们应该注意的是变量left与变量right求平均值,并且赋值到变量mid,而变量mid的类型为int类型,即这个平均值取整数,所以变量mid肯定指向下标为5的元素。
直到现在,我们便求出来变量k也就是我们要寻找元素的下标了。
那么,一定有人在问,如果上面一步在要求的下标为6的元素会不会无法求出该元素呢?如果我们要求的元素下标为6的话,该元素的大小比变量mid所在元素要大,所以变量left便继续在变量mid的大小情况下加一,如下
毫无疑问,我们还是找到了该元素,这就是二分查找算法的思想。
接下来的我们采用代码实现:
#include<stdio.h>intmain(){int arr []={1,2,3,4,5,6,7,8,9,10};//求元素个数int sz =sizeof(arr)/sizeof(arr[0]);//想要求的元素,这里假设我要求6int k =6;int left =0;int right = sz -1;//循环实现多次left和right的调整while(1){//mid要多次求解,应该在循环内部int mid =( left + right )/2;if(k>arr[mid]){//实现left的变化
left = mid +1;}elseif(k<mid){//实现right的变化
right = mid -1;}else{//k和mid相等printf("找到了,下标是:%d\n",mid);//找到了,跳出循环break;}}return0;}
这就是我们的二分查找的算法,那么在这篇文章和上篇文章都是在有序数组中查找具体某个元素的,如果是在无序的数组中应该多进行哪一步呢?接下来,我将为大家带来———冒泡排序,将我们的数组进行排序,喜欢的小伙伴关注点一点,下期更精彩。
版权归原作者 GD_small_bit 所有, 如有侵权,请联系我们删除。