对于一个有序数组进行查找可以有很多种方法,目前还在C语言阶段,所以就学了三种分别是常规查找,折半查找,函数查找(这些方法都是差不多的);
接下来我就先讲:
1.常规查找
常规查找就是数组从左到右一个一个与被查找的关键字比较,相等就是找到了,则输出下标;如果到最后都没有与之相等的数据那就是找不到这个数,则输出找不到这个元素。知道了思路就开始写代码了:
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//简单的取十个数
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//求数组元素个数
int key = 0;
printf("请输入想要查找的元素:");
scanf("%d", &key);
while (i < sz)
{
if (arr[i] == key)
{
printf("\n找到了,元素下标是%d\n",i);
break;//找到了就跳出循环
}
i++;
}
if(i > sz-1)
{
printf("\n元素找不到\n");
}
return 0;
}
while循环也可以写for循环,差不多一样。循环停止条件就是整个数组全部查找完,当数组大于最后一个(sz-1)时就没有元素相比较了。
2.折半查找(二分查找)
折半查找顾名思义对半从中间开始查找,当查找的数与中间元素相比,大了(key>arr[mid])就可以舍去前半部分(有序表);小了(key<arr[mid])就可以舍去后半部分。接着开始同样的操作,但是这里的left或right不再一样了。
关于mid=(left+right)/2这样写也可以,但是更严谨一点就是mid=left+(right-left)/2(这样写是为了防止溢出,int类型存放的元素有限制 left+right怕超出范围)。
假如key=7;则key>arr[mid],需要挪动left,left需要挪到mid后一个数上(即left=mid+1),因为在比较中已经与mid比较过了,所以不需要再次比较。假如key<mid,则需要挪动right,right=mid-1。如下图:
现在arr[mid]=8,与要查找的key=7相比大了,再继续上面相同的操作,如下图:
现在arr[mid]=6,比key=7小,则挪动left的位置,这时left,right和mid三个都指向同一个数,这个被查找的数就找到了。
假如这个数组里没有要查找的数,而程序不知道这个数组全部查询完了,如果再往下走同样的操作,就会出现left在后right在前的情况,所以需要我们自己设置一个条件(left<=right) 防止重复查询。下面是折半查找的代码:
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz=sizeof(arr)/sizeof(arr[0]);
int left = 0;
int right = sz-1;
int key = 0;
int i = 0;
printf("请输入想要查找的元素:");
scanf("%d", &key);
while (left <= right)
{
int mid = left+(right-left)/2;//防止溢出(int存放的元素有限制)
if (arr[mid] == key)
{
printf("\n找到了,元素下标是%d\n", mid);
break;
}
else if (arr[mid] > key)
{
right = mid - 1;//大了,挪right
}
else
{
left = mid + 1;//小了,挪left
}
}
if (left > right)
{
printf("\n元素找不到\n");
}
return 0;
}
3.函数查找
函数查找就是设置调用一个函数进行查找,这个方法与第二个差不多,主要要注意的就是返回值,以及函数的调用时并不是将整个数组传过去(我在下面代码中标注了)。
#include<stdio.h>
int binary_search(int arr[], int key, int sz)
{
int left = 0;
int right = sz-1;
while (left <= right)
{
int mid = left + (right - left) / 2;//防止溢出(int存放的元素有限制)
if (arr[mid] == key)
{
return mid;
}
else if (arr[mid] > key)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;//-1是为了与下标0-9区分开
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int key = 0;
printf("请输入想要查找的元素:");
scanf("%d", &key);
int ret = binary_search(arr, key, sz);//arr数组在传参时只把首元素地址传到函数中
if (ret == -1)
{
printf("\n元素找不到\n");
}
else
{
printf("\n找到了,元素下标是%d\n", ret);
}
return 0;
}
以上就是我所学的有序数组的查找,目前能力有限只能写到这。