当前位置:   article > 正文

二分查找算法简介_无序 可以用二分吗

无序 可以用二分吗

本文简要介绍二分查找(binary search)算法的相关知识。

1 概述

如果一个列表是无序的,那么顺序查找(sequential search)是唯一可选的元素查找办法;但是对于有序列表(sorted list),就可以选择效率更高的二分查找(也称折半查找)算法。

二分查找从一个列表的中间元素来测试,判断目标元素在列表的前半部分还是后半部分。如果在前半部分,就不需要查找后半部分;如果在后半部分,就不需要查找前半部分,也就是说,通过此判断可以减少一半的列表的查询工作。重复此过程直到找到目标元素的位置,或者确定目标元素不在这个列表里。

根据上述内容,可总结二分查找算法的一般解题步骤如下:

  1. 确定列表的首元素位置first、末尾元素位置last;
  2. 通过计算得出列表的中间元素位置mid以及对应的值;
  3. 比较目标元素与mid对应的值;
  4. 如果步骤3的比较结果相同,则算法结束;
  5. 如果步骤3的比较结果不同,则重复执行步骤1至步骤3,直至步骤4的条件出现,或者末尾元素位置last大于首元素位置first,即确认目标元素不在此列表中。

2 示例及分析

二分查找算法的示例代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. /* 二分查找函数声明 */
  6. int BinarySearch(int array[], int target);
  7. int num[5] = {0};
  8. int i = 0;
  9. int target = 0;
  10. int loc = -1;
  11. /* 接收用户输入的5个整型数 */
  12. printf("please input 5 SORTED(from small to large) integer numbers: \n");
  13. for (i = 0; i < 5; i++)
  14. {
  15. scanf("%d", &num[i]);
  16. }
  17. /* 接收用户输入的待查找数字 */
  18. printf("please input the number to be searched: \n");
  19. scanf("%d", &target);
  20. /* 调用二分查找函数查找目标数字 */
  21. loc = BinarySearch(num, target);
  22. if (-1 == loc)
  23. {
  24. printf("number(%d) is not included in the num list!\n", target);
  25. }
  26. else
  27. {
  28. printf("location of number(%d) is %d.\n", target, loc);
  29. }
  30. return 0;
  31. }
  32. /*
  33. * 二分查找函数定义:此函数用于在有序的(从小到大)整型数字列表中查找给定数字的位置,
  34. * 如果给定数字在列表中,则返回该数字在列表中的位置,否则返回-1。
  35. * 数组array存放有序整型数字列表
  36. * target为待查找的数字
  37. */
  38. int BinarySearch(int array[], int target)
  39. {
  40. // 待搜索有序整型数字列表的起始、终止和中间位置
  41. int first = 0;
  42. int last = 4;
  43. int mid = -1;
  44. while (first <= last)
  45. {
  46. // 计算中间位置
  47. mid = first + (last - first)/2;
  48. if (target > array[mid])
  49. {
  50. first = mid + 1;
  51. }
  52. else if (target < array[mid])
  53. {
  54. last = mid - 1;
  55. }
  56. else
  57. {
  58. return mid;
  59. }
  60. }
  61. // 未找到待查找数字
  62. return -1;
  63. }

上述代码的运行结果如下:

说明:

  • 在使用二分查找算法查找元素时,提供的必须是有序列表;
  • 在上述代码中,计算中间元素位置mid时使用语句“mid = first + (last - first)/2;”,与语句“mid = (first + last)/2”相比,可以避免整数溢出的问题。

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

闽ICP备14008679号