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);
        
    }
 
}
相关推荐
云泽8088 小时前
模块化设计,static和extern(面试题常见)
c语言·面试·职场和发展
才鲸嵌入式9 小时前
Windows10下使用QEMU安装Ubuntu20.04虚拟机,并启用硬件加速
c语言·ubuntu·嵌入式·qemu·虚拟机·模拟器
whoarethenext12 小时前
c/c++的opencv霍夫变换
c语言·c++·opencv
学渣6765612 小时前
vscode开发stm32,main.c文件中出现很多报错影响开发解决日志
c语言·vscode·stm32
秋山落叶万岭花开ღ14 小时前
链表:数据结构的灵动舞者
c语言·数据结构·python·算法·链表
不秃的开发媛14 小时前
C与C++相互调用
c语言·开发语言·c++
草莓熊Lotso15 小时前
【C语言编译与链接】--翻译环境和运行环境,预处理,编译,汇编,链接
c语言·开发语言·汇编·经验分享·笔记·其他
悟凡爱学习16 小时前
Onvif协议:IPC客户端开发-IPC相机控制(c语言版)
c语言·开发语言
MaisieKim_17 小时前
如何实现 C/C++ 与 Python 的通信
c语言·c++·python
青出于兰21 小时前
C语言| 函数参数传递指针
c语言·开发语言