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

简介: 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);  
} 


20210508225311599.png


最后输出的结果


二分查找



二分查找的要求:

  • 有序数列

有序化方法: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));  
} 

20210509023204494.png

这个是基础的,我们还可以使用递归法


递归法



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


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

目录
相关文章
|
26天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
35 6
|
29天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
|
1月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
1月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
1月前
|
C语言 C++
保姆式教学C语言——数组
保姆式教学C语言——数组
17 0
保姆式教学C语言——数组
|
1月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
1月前
|
C语言
C语言数组
C语言数组
17 0
|
1月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
6月前
|
存储 C语言
C语言中的数据输入输出
C语言中的数据输入输出
75 0