本文编译环境:Dev c++ 5.4.0
语言:c
序言:方法分为,二分法,再根据二分法二分的思想,扩展为多分就有了分块查找的思想。
#include <stdio.h>
int search(int aim,int data[],int size){
//二分法搜索
int det = -1;//初始化表示没有找到
int left = 0;//左指针位置
int right = size-1;//右指针位置
while(left<=right){
int mid = (left+right)/2;//中间位置
if(data[mid]<aim){
left = mid+1;//位置偏右,左指针右移动
}else if(data[mid]>aim){
right = mid-1;//位置偏左,右指针左移动
}else{
det = mid;//相等,赋值此刻的下坐标
break;//一定要break跳出循环
}
}
return det;
}
int main(){
int aim=14;
int data[]={5,7,9,11,13,17,24,47,68,72,89,90,112};
printf("%d\n",search(aim,data,13));
return 0;
}
- 分块查找
- 操作步骤:
然后,在已确定的块中用顺序法进行查找。
#include<stdio.h>
struct index
{
int key;
int start;
int end;
} index[4];
int main(void)
{
int search(int key , int a[]);
int i , j = -1 , k , key;
int a[] = {42 , 63 , 82 , 89 , 111 , 146 , 219 , 254 , 325 , 336 , 348 , 795 , 876 , 951 , 998};
printf("已知有一组数\n");
for(i = 0; i < 15; i++)
printf("%d " , a[i]);
printf("\n");
for(i = 0; i < 3; i++)
{
index[i].start = j + 1;
j = j + 1;
index[i].end = j + 4;
j = j + 4;
index[i].key = a[j];
}
printf("请输入要查找的数\n");
scanf("%d" , &key);
k = search(key , a);
if(k > 0)
printf("查找成功!您要找的数在数组中的位置是:%d\n" , k + 1);
else
printf("查找失败!您要找的数不在数组中。\n");
}
int search(int key , int a[])
{
int i , j;
i = 0;
while(i < 3 && key > index[i].key)
i++;
if(i >= 3)
return -1;
j = index[i].start;
while(j <= index[i].end && a[j] != key)
j++;
if(j > index[i].end)
j= -1;
return j;
}
这些代码都是跑过的,建议大家还是自己亲手敲一遍加深印象,作者这里也是一字一字敲出来的,要避免眼高手低。
本章的内容有误或者不懂的地方,大家可以私信我,我也会第一时间回复大家的,差不多暑假两个月,复习下这些基本知识,其他的问题也可以问我,就算我不知道的,在能力范围之内的一定竭尽全力为你们解答。我的QQ:932824098.