今天我们来看两种查找算法。
二分查找
这应该是初学者(指我自己)最常用的了,原理非常简单。对于要查找的数据,我们在有序数组里面对取前后下标的平均值mid,判断mid所对应的数和要找的键值的大小关系。
步骤:
①对数组排序;
②分别取变量int left=0;int right=sizeof(arr)/sizeof(arr[0])-1;int mid=(right+left)/2; 并判断arr[mid]和 要找的数n之间的大小;
③若相等,则跳出循环;
若n>arr[mid],说明要找的数在数组的右半边,则令left=mid+1;
若n<arr[mid],则令right=mid-1; 并重复步骤②③
上代码
#include<stdio.h>
int main()
{
int arr[10] = { 9,33,66,74,88,96,123,144,156,200 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
int n = 0;
scanf("%d", &n);
while (1)
{
int mid = (left + right) / 2;
if (n == arr[mid])
{
printf("找到了,位置是%d\n", mid + 1);
break;
}
else if (left >= right)
{
printf("找不到了\n");
break;
}
else if (n < mid)//在左边
{
left = mid;
}
else if (n > mid)
{
right = mid;
}
}
return 0;
}
插值查找
插值查找是二分查找的改进版。在二分查找中,如果数据量非常大,处理的时间就会很长。在原先的思想下,我们改取左右两边的平均数为按比例取中间值,请看公式
步骤:
①数组排序;
②按公式取得中间值,然后比较中间值对应的数和要查找的数的大小;
③若相等,跳出循环;
若n>arr[mid],说明要查找的数在中间值的右边,则令mid=left+1;
若n<arr[mid],则令mid=right-1; 并重复步骤②③
上代码
#include<stdio.h>
int main()
{
int arr[10] = {9,33,66,74,88,96,123,144,156,200};
int left = 0;
int right = 9;
int n = 0;
scanf("%d", &n);
while (1)
{
int mid = left + ((n - arr[left]) / (arr[right] - arr[left])) * (right - left);
if (n == arr[mid])
{
printf("\n找到了,位置是%d", mid+1);
break;
}
else if (left >= right)//先判断是否出界
{
printf("\n找不到了");
break;
}
else if (n < arr[mid])//说明数在左边
right = mid - 1;
else if (n > arr[mid])
left = mid + 1;
}
return 0;
}
希望与诸君共勉