• 0
  • 0
  • 0
  • C语言数组常见查找方式

  • 小小baby
  • 630,263
  • 2026-06-28 22:50
  • 01,基本查找/顺序查找

    从字面意思理解就是,从数组索引0开始逐个进行查找,最终查找出数组中的某个数据。

    写法:

    int order(int arrar[], int length, int num) {
    	for (int i = 0; i < length; i++) {
    
    		if (num == arrar[i]) {
    			return i;
    		} 
    
    	}
    	return -1;
    }
    int arrar[] = {12,55,44,66,23,78,91};
    int length = sizeof(arr) / sizeof(arr[0]);
    
    int num = 4;
    
    
    // 传递参数
    int index = order(arrar,length,num);
    //打印结果,如果找到了就返回当前元素的索引否则返回 “-1”
    printf("%d",index);

    02,二分查找/折半查找

    前提条件:数组中的数据必须是有序的(可以从小到大,也可以从大到小),绝对不能是乱的。

    核心逻辑:每次排除一半的查找范围。从大范围一点一点的缩小范围直到能查找出相应的元素。

    计算公式:mid = min - max / 2,假设 mid对应的索引3是88,

    int arr[] = {1,2,3,4,5,6,7,8,9,10, ~ 95,96,97,98,99,100};

    假如我要查找的范围是79,通过与mid(88)进行比较 如果mid为较大,那么它的范围就在 1 ~ 88此时88后面的数直接丢弃。此时max的范围需要从新开始计算max = mid - 1

    如果查找的范围36是 小于 mid(88)取值范围的那么就变成这样:  36 ~ 88 范围;此时min的范围需要从新开始计算min= mid + 1

    在开始查找之前需要定义五个变量

    int array[] = {7,23,79,81,103,127,131,147};  // 数组
    int length = sizeof(array) / sizeof(array[0]);  // 计算数组的个数
    int min = 0; //数组第一个元素
    int max = length - 1;  // 数组最后一个元素
    int mid = (min + max) / 2; // 获取中间位置

    完成代码:

    	int array[] = {7,23,79,81,103,127,131,147};
    	int length = sizeof(array) / sizeof(array[0]);
    
    
    	// 需要查找的元素 
    	int num = 147;  
    	int index = par(array, length, num);
    	printf("%d", index);
    	
    	
    int par(int array[],int length,int num) {
    	int min = 0;
    	int max = length - 1; 
    	while (min <= max) { 
    		 //二分查找法
    		//int mid = (min + max) / 2; 
    		if (array[mid] < num) {
    			min = mid + 1;
    		}
    		else if (array[mid] > num) {
    			max = mid - 1;
    		}
    		else {
    			return mid;
    		}
    
    	}
    
    	return -1;
    }

    值得注意的是mid 始终是在 min和max中间的(min <= max)。如果一mid旦超过max或者min的值就可以断定需要查找的元素不存在。

    03,插值查找

    实际上插值查找就是在二分查找的基础上改变了获取数组中间位置的公式(mid = (min + max) / 2)变成了 :

    核心逻辑就是通过缩小元素之间的的误差从而提升计算精度。

    要求:数据要有序,并且尽可能分布要均匀一些。

    优势:满足要求提升查询效率,不然出现反效果。

    总结

    1. 顺序查找的特点
    对于数据没有任何要求,从头到尾遍历数组即可

    2. 二分查找、插值查找各自的特点
    相同点:
    都是通过不断的缩小范围来查找对应的数据的
    不同点:
    计算 mid 的方式不一样 ;二分查找(min + max)\ 2 ,插值查找min + (num - array[min]) / (array[max] - array[min]) * max - min
    二分查找:mid 每次都是指向范围的中间位置
    插值查找:mid 尽可能的靠近要查找的数据,但是要求数据尽可能的分布均匀。

    评论

  • 0
    /1000
    最热
  • 最新

    确认跳转

    您即将离开当前页面,访问外部链接。请注意核对网址,保护隐私安全。

    https://example.com

    言心安全助手 · 建议确认来源可信

    • 0
    • 0
    • 0
    登录后参与评论