C语言白话数组数据查找
遍历查找
方法和名字一样就是逐个循环去查找数据,然后进行比较获得我们所需要的值。
#include<stdio.h>
main(){
int a[10]={1,2,3,4,5,6,7,8,9,10},i,j=-1;
int b=5;
for(i=0;i<10;i++){ // 循环大小
if(a[i]==b){ // 判断值
printf("%d所对应的的值是%d",b,i);
j=i;
break;
}
}
if(j==-1){ // 不存在输出
printf("%d没有对应的值",b);
}
}
上面是主函数写法
下面为函数写法
#include<stdio.h>
int traver(int a[],int len,int b){
/*
* a[]:数组
* len:数组的长度
* b:需要确认的值
*/
int i,j=-1;
for(i=1;i<len;i++){ // 循环len次
if(a[i]==b){ // 判断大小
printf("%d对应的值是%d",b,i);
j=i; // 设置台阶用于判断值是否存在
break; // 跳出此循环
}
}
if(j==-1){ // 判断值是否存在
printf("%d在数组中没有对应的值",b);
}
}
main(){
int a[10]={1,2,3,4,5,6,7,8,9,10},len=10,b=5;
traver(a,len,b);
}
最后输出的结果
二分查找
二分查找的要求:
- 有序数列
有序化方法:C语言白话数组排序 传送门
#include<stdio.h>
int array_sort2(int num[],int n){
int i,j,t;
for(i=0;i<n-1;i++){ // 循环n-1次
for(j=0;j<n-i;j++){ // 嵌套循环
if(num[j]>num[j+1]){ // 比较j和j+1位置上的数据大小
// 成立就替换
t=num[j];
num[j]=num[j+1];
num[j+1]=t;
}
}
}
}
main(){
int i,j,t,num[10],n=10,k;
printf("输入10个待排序的数据\n");
for(i=0;i<n;i++){
scanf("%d",&num[i]); // 循环输入值
}
array_sort2(num,n);
}
通过上面的代码已经获得了顺序后的数据
普通方式
int dichotomy1(int num[],int n,int item){
int low=0, high=n-1, mid=0;
do{
mid=(low+high) / 2;
if (item > num[mid]){
low = mid + 1;
}
else{
high = mid - 1;
}
} while (high >= low && num[mid] != item);
if (num[mid] == item){
return mid;
}
else{
return -1;
}
}
main(){
int i,j,t,num[10],n=10,k=6;
printf("输入10个待排序的数据\n");
for(i=0;i<n;i++){
scanf("%d",&num[i]); // 循环输入值
}
array_sort2(num,n);
printf("%d在排序后的位置是%d",k,dichotomy1(num,10,k));
}
这个是基础的,我们还可以使用递归法
递归法
int dichotomy2(int num[],int left,int right,int eval){
/*
* num[]: 输入的数组
* left: 起始下标
* right: 结束下标
* eval: 要查找的元素
* return: 返回的数据是查找数据的位置,没有数据为-1
*/
int i;
if(left>right)return -1; // 查看下标位置是否正确
i=(left+right)/2;
if(num[i]==eval){ // 大小一致就输出位置
return i;
}
else if(num[i]>eval){ // 比较小的那一边的数据
return dichotomy2(num,left,i-1,eval);
}
else{ // 比较大的那一边的数据
return dichotomy2(num,i+1,right,eval);
}
}
就暂时到这里如果有什么问题可以留言,会及时处理。