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值造成电脑计算错误。
最后,如果存在错误,希望各位多多指正啦~明天会更好!