C语言白话数组数据查找(遍历查找、二分查找)

193 阅读1分钟

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);
	}
}

就暂时到这里如果有什么问题可以留言,会及时处理。