• 查找算法——二分查找


    目录

    ​一、算法介绍

    1.算法思想

    2.算法流程

    二、算法实现

    1.代码实现

    2.测试用例及结果

    三、性能分析

    1.时间复杂度

    2.空间复杂度


    ​一、算法介绍

    1.算法思想

    二分查找也称折半查找,是一种效率比较高的查找算法,但是运用前提是查找的序列已经有序。其核心思想就是利用序列有序的特点,每次对序列中间元素进行比较,判断其与待查找元素的大小关系,来确定待查找元素是否是当前元素,或是在当前元素的左半部分还是右半部分,从而每次比较都能够淘汰一半的元素,缩小查找区间,所以其拥有较高的查找效率。

    2.算法流程

    示例:给定序列{1,2,3,4,5,6,7,8,9},查找元素3。

    每次比较后,若没有查找到待查找元素,都需要根据比较结果改变查找区间一侧边界,然后更新mid的位置,再进行下一次查找。

    二、算法实现

    1.代码实现

    1. #include
    2. using namespace std;
    3. //成功:返回下标 失败:返回-1
    4. int BinarySearch(int* arr, int size, int key) {//二分查找
    5. int left = 0;
    6. int right = size - 1;
    7. while (left <= right) {//注意等于时,也需要比较
    8. int mid = (left + right) / 2;
    9. if (arr[mid] < key) {
    10. left = mid + 1;
    11. }
    12. else if (arr[mid] > key) {
    13. right = mid - 1;
    14. }
    15. else {//查找成功
    16. return mid;
    17. }
    18. }
    19. return -1;//查找失败
    20. }
    21. void Test() {
    22. int arr[] = { 1,2,3,4,5,6,7,8,9 };
    23. int size = sizeof(arr) / sizeof(arr[0]);
    24. int key;
    25. cout << "请输入待查找元素:";
    26. cin >> key;
    27. int index = BinarySearch(arr, size, key);
    28. if (index == -1) {
    29. cout << endl << "没有待查找元素!" << endl;
    30. }
    31. else {
    32. cout << endl << "元素" << key << "所在位置下标为:" << index << endl;
    33. }
    34. }
    35. int main() {
    36. Test();
    37. return 0;
    38. }

    2.测试用例及结果

    序列:1,2,3,4,5,6,7,8,9

    查找元素3:

    查找元素:9

     

    查找元素:10

     

    查找元素:0

     

    三、性能分析

    1.时间复杂度

    最坏情况O(log_{2}^{n}):

    根据算法思想可知,最坏情况即最后一次比较才找到待查找元素,也即是left与right重叠,查找区间内只剩一个元素时。根据算法思想每次淘汰一半元素可知,就相当于每次查找区间内元素减少一半,减少几次后只剩1个元素即最大的查找次数,即log_{2}^{n}次,所以最坏情况下的时间复杂度为

    O(log_{2}^{n})

     最好情况O(1):

    最好情况即只需要比较一次就找到待查找元素,根据算法思想可知此时待查找元素刚好位于序列的中间位置,所以最好情况下的时间复杂度为O(1)

    平均情况O(log_{2}^{n}):

    综合两种情况,二分查找的时间复杂度为O(log_{2}^{n})。

    2.空间复杂度

    O(1)

    由于算法中只设置了几个临时变量用于限定查找区间和查找元素,并没有借助额外的辅助空间,所以空间复杂度为O(1)。

    活动地址:CSDN21天学习挑战赛

  • 相关阅读:
    java积累
    学习二叉树,Java实现
    Bootstrap响应式轮播效果网页(1+X Web前端开发中级 例题)
    shell示例
    道德与社会问题简报 #4: 文生图模型中的偏见
    转载csdn文章操作
    MySQL —— 索引
    400电话呼叫中心-佳音通讯400电话
    SPSS数据分析常见问题(差异性研究)
    mysql value 和values的区别
  • 原文地址:https://blog.csdn.net/m0_63020222/article/details/126236527