遍历查找
方法和名字一样就是逐个循环去查找数据,然后进行比较获得我们所需要的值。
#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); } }
就暂时到这里如果有什么问题可以留言,会及时处理。