当前位置:   article > 正文

C语言入门——二分查找_c语言数组二分查找

c语言数组二分查找

 二分查找也称折半查找,它是一种效率较高的查找方法

例:在一个有序数组中查找具体的某个数字n,

        如,在一个一维数组中存储了一组有序元素1 2 3 4 5 6 7 8 9 10,现在我们要查找数字7,有人会想从前往后遍历去查找,这样固然可行,但是如果数据元素不是10个,而是一千甚至一万,则这样的查找效率显得很低

        这里我们忽略了这组元素是有序的,我们可以从这组数据的中间开始查找,取中间的元素与要查找的元素比较大小,这样一次比较可以排除一半的元素,显然效率比遍历更高,这就是我们要说的二分查找,又称为折半查找

如在1 2 3 4 5 6 7 8 9 10查找7

我们查找的思路如下:

首先找到这组元素的中间元素:最左边元素的下标和最右边元素的下标之和除以2,作为中间元素的下标,如本例,(9+0)/ 2 = 4,4作为中间元素的下标,对应的数字是5

5比要找的数字7小,被查找的范围变为6 7 8 9 10;

新的被查找的范围的中间元素的下标(5+9)/ 2 = 7,对应的数字是8

8比要找的数字8大,被查找的范围6 7;

新的被查找的范围的中间元素的下标(5+6)/ 2 = 5,对应的数字是6

6比要找的数字7小,被查找的范围7;

新的被查找的范围的中间元素的下标(6+6)/ 2 = 6,对应的数字是7,找到了

我们发现上面算法只找了4次就找到了所要找的元素,如果是遍历的话,最坏的情况要找10次,所以二分查找其效率较高,其时间复杂度为log_{2}n

用代码实现:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[] = {1,2,3,4,5,6,7,8,9,10};
  5. int k = 7; //要查找的数字
  6. //在数组中查找k
  7. int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
  8. int left = 0;
  9. int right = sz -1;
  10. while(left <= right)
  11. {
  12. int mid = (left + right) / 2;
  13. if(arr[mid] < k)
  14. {
  15. left = mid + 1;
  16. }
  17. else if(arr[mid] > k)
  18. {
  19. right = mid - 1;
  20. }
  21. else
  22. {
  23. printf("找到了:%d,其下标是:%d\n",arr[mid],mid);
  24. break;
  25. }
  26. }
  27. if(left > right)
  28. {
  29. printf("找不到\n");
  30. }
  31. return 0;
  32. }

 我们运行可以得到:

当把k改为11 ,我们发现找不到


如果上述代码要用函数实现,我们需要注意

如果函数内部需要参数部分传递某个数组元素的个数,数组元素个数要在函数外部求

如果在函数内部求数组元素个数,因为数组名传参传递的是数组名的首元素地址,此时sizeof(arr)算出的结果为4,sizeof(arr) / sizeof(arr[0])算出的结果为1,而不是元素个数,这点需要注意

用函数实现一个整型有序数组的二分查找:

  1. #include <stdio.h>
  2. int binary_search(int a[], int k, int s)
  3. {
  4. int left = 0;
  5. int right = s - 1;
  6. while(left <= right)
  7. {
  8. int mid = (left + right) / 2;
  9. if(k < a[mid])
  10. {
  11. right = mid - 1;
  12. }
  13. else if(k > a[mid])
  14. {
  15. left =mid + 1;
  16. }
  17. else
  18. {
  19. return mid;
  20. break;
  21. }
  22. }
  23. return -1;
  24. }
  25. int main()
  26. {
  27. int arr[] = {1,2,3,4,5,6,7,8,9,10};
  28. int k = 0;
  29. printf("输入要查找的数:");
  30. scanf("%d",&k);
  31. int sz = sizeof(arr) / sizeof(arr[0]);
  32. //找到就返回找到的位置的下标
  33. //找不到就返回-1
  34. int ret = binary_search(arr, k, sz);
  35. if (ret == -1)
  36. {
  37. printf("找不到\n");
  38. }
  39. else
  40. {
  41. printf("找到了:%d,下标是:%d\n",arr[ret],ret);
  42. }
  43. return 0;
  44. }

 运行结果如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/620770
推荐阅读
相关标签
  

闽ICP备14008679号