查找方式:依次查找与二分查找

简介: 查找方式:依次查找与二分查找

1.依次查找与二分查找的基本概念

1.1什么是依次查找?

故名思意,依次查找指的是对于任意一个序列,从一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k进行比对,条件符合者选出,不符者略过的一种查找方法

1.2什么是二分查找?

二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,有点类似分治的思想。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

2.两种查找方式的各自优劣

无论是哪种查找方式,都有其优劣性,并不能说谁好谁坏,只能说某一种情况下谁好一些,谁不适用一些

2.1依次查找优劣:

1.适用范围:任何数组都可以使用这个方法,适用范围大

2.运算效率:电脑运算量不可减免,运算效率一般

2.2二分查找优劣:

1.适用范围:使用的前提条件是有序数组,适用范围有限

2.运算效率:一旦适用,大大减少电脑运算量,提升运算效率

3.两种代码的实现示例

依次查找代码示例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
  int arr[] = { 2,4,3,5,7,6,1,9,8 };
  int input = scanf("%d", &input);
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  int find = 0;
  for (i = 0; i < sz; i++)
  {
    if (input == arr[i])
    {
      printf("找到了,查找数字的下标是%d", i);
      find = 1;
      break;
    }
  }
  if (find == 0)
    printf("您查找的数字没有找到");
  return 0;
}

二分查找代码示例

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
  int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int sz = sizeof(arr) / sizeof(arr[0]);
  int left = 0;
  int right = sz - 1;
  int input = 0;
    scanf("%d", &input);//这里需要注意,scanf有返回值,不可以写成“int input =     scanff("%d",&input);
  int find = 0;
  while (left<=right)
  {
    int mind = (left + right) / 2;
    if (input > arr[mind])
      left = mind + 1;
    else if (input < arr[mind])
      right = mind - 1;
    else if (input == arr[mind])
    {
      printf("找到了,下标是%d", mind);
        find = 1;
      break;
    }
  }
  if (find == 0)
    printf("没有找到\n");
  return 0;
}

4.有趣思维

上述二分查找的确数字较小时候可以使用,但是一但上升的超过int max值的时候呢?

由vs转到定义我们可以知道int类型的上限

或许你可能想到了,我直接把int 类型换成longlong类型不就可以扩大max值了吗,以此来扩大数组大小。。。

首先,这个把int改longlong方法的确可以,不过还有一种比较好的数学思维

下面来简要介绍一下这种处理方法:

1.为了便于大家理解,我们用数学方式求均值来进行呈现:

一般的数学思维:(a+b)/2

高端的数学思维(假设a<b):(b-a)/2+a

2.柱状图来理解两者求均值的方法

因此,我们可以把这个代码

给他改成

int mind = ( right - left )/ 2 + left

这样就一定程度上扩大了该代码的应用范围,不至于在较大数字运算时超过int max值造成电脑计算错误。

最后,如果存在错误,希望各位多多指正啦~明天会更好!

相关文章
|
3月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
3月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
6月前
|
算法 Java C++
实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)
实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)
43 0
|
6月前
|
算法
leetcode-34:在排序数组中查找元素的第一个和最后一个位置
leetcode-34:在排序数组中查找元素的第一个和最后一个位置
33 0
|
6月前
排序和查找
排序和查找
57 0
|
算法
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
63 0
LeetCode-34 在排序数组中查找元素的第一个和最后一个位置
LeetCode-34 在排序数组中查找元素的第一个和最后一个位置
|
存储 算法
数组算法:倒置,查找,插入,删除
数组算法:倒置,查找,插入,删除
83 0
|
算法 C语言 C++
【二分查找】34. 在排序数组中查找元素的第一个和最后一个位置
二分查找是一种高效的查找算法,其时间复杂度为 O(log n)。在许多情况下,我们需要在一个有序数组中找到某个目标值的搜索范围。本文将介绍一种基于二分查找的搜索范围查找算法,该算法能够快速找到目标值在数组中的起始和结束位置。
72 0