数组的查找算法
顺序查找的特点
对于数据没有任何要求,从头到尾遍历数组即可
二分查找、插值查找各自的特点
相同点:
都是通过不断的缩小范围来查找对应的数据的
数据一定要是有序的
不同点:
计算mid的方式不一样
二分查找:mid每次都是指向范围的中间位置
插值查找:mid尽可能的靠近要查找的数据,但是要求数据尽可能的分布均匀
代码案例
#include <stdlib.h> #include <stdio.h> int order(int length,int arr[],int num); //声明函数顺序查找法 int half(int length,int arr[],int num); //声明函数2分查找法 int insert(int length,int arr[],int num); //声明函数插值查找法 int main() { int arr[] = {11,22,33,44,55}; //定义数组 int length = sizeof(arr) / sizeof(arr[0]); //计算数组长度 int num = 44; //假设要查找的数为44 int index = insert(length,arr,num); //调用最适合此数组的插值查找法 printf("你要查找的数据的索引为:%d\n",index); return 0; } int order(int length,int arr[],int num) //顺序查找 { int i; //声明变量i for(i = 0;i < length;i++) //循环数组中的元素 { if(arr[i] == num) //判断是否等于要查找的元素 { return i; //是的话返回此时索引 } } return -1; //否返回不存在的索引-1 } int half(int length,int arr[],int num) //2分查找 { int min = 0; //定义min为头索引 int max = length-1; //定义max为尾索引 while(min<=max) //当min小于等于max,就进入循环 { int mid = (max+min) / 2; //定义中位索引 if(num < arr[mid]) //判断要查找到数是否大于中位索引对应的元素 { max = mid - 1; //是的话就修改max为mid-1,缩小范围 } else if(num > arr[mid]) //判断要查找到数是否小于中位索引对应的元素 { min = mid + 1; //是的话就修改min为mid+1,缩小范围 } else { return mid; //不大于不小于就只有等于,那么中位索引对于的元素就是要查找到值 } } return -1; //当min大于max,就说明数组内没有这个元素,就返回不存在的索引-1 } int insert(int length,int arr[],int num) //插值查找 { int min = 0; int max = length-1; while(min<=max) { //插值查找和2分查找的区别就在于mid的定义 //在 C 语言中,整数除法会截断小数部分,因此需要强制转换为 double 类型来避免整数截断 int mid = min + (double)(num -arr[min]) / (arr[max] - arr[min]) * (max-min); if(num < arr[mid]) { max = mid - 1; } else if(num > arr[mid]) { min = mid + 1; } else { return mid; } } return -1; }