C 语言基础五: 数组 - 练习demo

C 语言基础五: 数组 - 练习demo

一.基础习题

习题1 - 求最值

已知数组元素 22 45 32 56 78,求最大值输出

ini 复制代码
    int arr[] = {22,45, 32, 78,56,66 };
    int len = sizeof(arr)/sizeof(int);
    int max = arr[0];
    for (int i = 1; i < len; i++) {
        if(arr[i] > max){
            max = arr[i];
        }
    }
    printf("%d\n",max);

习题2 - 求和

  1. 生成10个1-100随机数求和,且随机数不重复
  2. 统计有几个值比平均值小
ini 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int contain(int arr[],int len,int num);

int main(void){
   
    int arr[10];
    int len = sizeof(arr)/sizeof(int);
    
    //设置随机数种子
    srand(time(NULL));
    int sum = 0;
    for (int i = 0; i < len; ) {
        int num = rand() % 100 ;
        if(!contain(arr,len,num)){
            arr[i] = num;
            printf("pr: %d\n",arr[i]);
            sum = sum + arr[i];
            i++;
        }
    }
    printf("总和: %d\n",sum);
    
    int eve = sum/len;
    printf("平均值: %d\n",eve);
    
    int count = 0;
    for (int j = 0; j < len; j++) {
        if(arr[j] < eve){
            count ++;
        }
    }
    printf("小于平均值个数: %d\n",count);

}

int contain(int arr[],int len,int num){
    for (int i = 0; i < len; i++) {
        int x = arr[i];
        if (x == num) {
            return 1;
        }
    }
    return 0;
}

习题3 - 反转数组

ini 复制代码
#include <stdio.h>

// 反转数组
void printfArr(int arr[],int len);

int main(void){
   
    int arr[] = {22,33,44,55,66};
    int len = sizeof(arr)/sizeof(int);
    
    int i = 0;
    int j = len -1;
    while (i < j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
        i++;
        j--;
    }
    printfArr(arr, len);
}

void printfArr(int arr[],int len){
    for (int i = 0; i < len; i++) {
        printf("%d \n",arr[i]);
    }
}

习题4 - 打乱数组

ini 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
   
    int arr[] = {22,33,44,55,66};
    int len = sizeof(arr)/sizeof(int);
    
    //设置随机数种子
    srand(time(NULL));
    for (int i = 0; i < len; i ++) {
        int index = rand()%len;
        int temp = arr[i];
        arr[i] = arr[index];
        arr[index] = temp;
    }
    for (int j = 0; j < len; j++) {
        printf("%d \n",arr[j]);
    }
}

二.查找

基础查找
ini 复制代码
#include <stdio.h>

int findElement(int arr[],int len,int num);
int main(void){
   
    int arr[] = {22,33,44,55,66};
    int len = sizeof(arr)/sizeof(int);
    int index1 = findElement(arr,len,44);
    int index2 = findElement(arr,len,88);
    printf("index1:%d\n",index1);
    printf("index2:%d\n",index2);
    
}

int findElement(int arr[],int len,int num){
    for (int i = 0; i < len; i++) {
        if(arr[i] == num){
            return i;
        }
    }
    return -1;
}
二分查找
  • 使用二分查找要排列好顺序,下面例子是升序
c 复制代码
#include <stdio.h>

int searchIndex(int arr[],int len,int num);

int main(void){
   
    //二分查找
    int arr[] = {12,13,14,15,16,17,18};
    int len = sizeof(arr)/sizeof(int);
    
    printf("12:%d\n",searchIndex(arr, len, 12));
    printf("13:%d\n",searchIndex(arr, len, 13));
    printf("14:%d\n",searchIndex(arr, len, 14));
    printf("15:%d\n",searchIndex(arr, len, 15));
    printf("16:%d\n",searchIndex(arr, len, 16));
    printf("17:%d\n",searchIndex(arr, len, 17));
    printf("18:%d\n",searchIndex(arr, len, 18));
    printf("20:%d\n",searchIndex(arr, len, 20));

    return 0;
}

int searchIndex(int arr[],int len,int num){
    int left = 0;
    int right = len - 1;
    while (left <= right) {
        // 45
        int mid = left + (right - left)/2;
        if(arr[mid] == num){
            return mid;
        }else if (arr[mid] > num){
            right = mid - 1;
        }else{
            left = mid + 1;
        }
    }
    return -1;
}
插值查找
  • 使用二分查找要排列号顺序,且均匀分布. 数据量大的数组合适,数据量小适合用二分查找 (1,3,4,5,6这种是均匀分布的,1,2,101,200 这种不是均匀的)
scss 复制代码
#include <stdio.h>

int findElement(int arr[],int len,int num);
int main(void){

      int arr[] = {12,14,15,16,18,19,22,23};
    int len = sizeof(arr)/sizeof(int);
    printf("12:%d\n",insert_select(arr, len, 12));
    printf("14:%d\n",insert_select(arr, len, 14));
    printf("15:%d\n",insert_select(arr, len, 15));
    printf("16:%d\n",insert_select(arr, len, 16));
    printf("18:%d\n",insert_select(arr, len, 18));
    printf("19:%d\n",insert_select(arr, len, 19));
    printf("22:%d\n",insert_select(arr, len, 22));
    printf("23:%d\n",insert_select(arr, len, 23));
    printf("24:%d\n",insert_select(arr, len, 24));
    
}

int insert_select(int arr[], int len,int num){
    
    int left = 0;
    int right = len - 1;
    while (left <= right) {
        int ap =  (num - arr[left])/(arr[right] - arr[left]);
        int half = left + (right - left) * ap;
        if(arr[half] == num){
            return half;
        }else if(arr[half] > num){
            right = half -1;
        }else{
            left = half + 1;
        }
    }
    
    return -1;
}

三.排序

冒泡排序
  • 数量小且基本有序的情况
ini 复制代码
#include <stdio.h>

void bubble(int arr[],int len);
void print_array(int arr[], int n);

int main(void){
   
    
    int arr[] = {4,2,7,6,10,5,1};
    int len = sizeof(arr)/sizeof(int);
    print_array(arr, len);
    bubble(arr, len);
    

    return 0;
}


// 打印数组函数
void print_array(int arr[], int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void bubble(int arr[],int len){
    
    int temp;
    
    for (int j = 0; j < len-1; j++) {
        for (int i = 0; i < len-1-j; i++) {  //没走一次都会把最大的数移动到最右边
            if(arr[i] > arr[i+1]){
                temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
                
            }
        }
        print_array(arr, len);
    }

}
选择排序
  • 数据量小,且交换操作代价高的情况
ini 复制代码
//交换元素
void swap(int* a,int* b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

void select_sort(int arr[],int len){
  
    int i ,j, min_index;
   
    for (i = 0; i < len-1; i++) {
       
        min_index = i;
        for (j = i+1; j < len; j++) {   //找到最小元素,和当前做交换
            if(arr[j] < arr[min_index]){
                min_index = j;
            }
        }
        
        if(min_index != i){
            swap(&arr[i], &arr[min_index]);
        }
        print_array(arr, len);
        
    }
  
}
插入排序
  • 适用小规模或部分有序的数据
ini 复制代码
//插入排序
void insert_sort(void){
    int arr[] = {5,4,2,6,1,3 };
    int len = sizeof(arr)/sizeof(int);
    
    int i ,j ,key;
    
    for (i = 1 ; i < len; i++) {
        key = arr[i];
        j = i -1;
        while (j >= 0 && arr[j] > key) {
            arr[j+1] = arr[j];
            j--;
           
        }
        arr[j + 1] = key;
        print_array(arr, len);
        
    }
 
}
相关推荐
智者知已应修善业3 分钟前
【51单片机8*8点阵显示箭头动画详细注释】2022-12-1
c语言·经验分享·笔记·嵌入式硬件·51单片机
极客小张3 小时前
【项目思路】基于STM32+ZigBee的智能家居--浴室场景设计
c语言·python·stm32·智能家居·课程设计·项目设计·企业项目
仰泳之鹅6 小时前
【C语言】深入理解指针(5)
c语言·开发语言
无为之士7 小时前
君正交叉编译链工具mips-gcc540-glibc222-64bit-r3.3.0.smaller.bz2编译st-device-sdk-c
c语言·开发语言
古译汉书11 小时前
嵌入式铁头山羊stm32-SAR型ADC模块介绍、采样时间、转换时间-Day24
c语言·stm32·单片机·嵌入式硬件·iot
我不是板神13 小时前
秋招|MCU+RTOS技术栈——面试八股文整理3:STM32
c语言
C灿灿数模14 小时前
2025全国大学生数学建模C题保姆级思路模型(持续更新):NIPT 的时点选择与胎儿的异常判定
c语言·开发语言·数学建模
啊?啊?15 小时前
17 C 语言宏进阶必看:从宏替换避坑到宏函数用法,不定参数模拟实现一次搞定
c语言·预处理·文本替换
热心网友俣先生18 小时前
2025年数学建模国赛C题超详细解题思路
c语言·开发语言·数学建模
jiaway18 小时前
【C语言】第二课 位运算
c语言·开发语言·算法