C语言复习4:有关数组的基础常见算法

news/2025/3/4 5:24:50/

# 数组的常见算法
    - 查找算法
       1. 基本查找/顺序查找
       2. 二分查找/折半查找
       3. 插值查找
       4. 分块查找
       5. 哈希查找
       6. 树表查找
       7. 斐波那契查找
       
    - 排序算法(顾名思义,就是把没有顺序的数据进行从小到大/从大到小排序)
       1. 冒泡排序
       2. 选择排序


## 基本查找/顺序查找
        - 核心思路:就是从数组的0索引开始,依次往后查找
           * 如果找到了,就会返回数据对应的索引
           * 如果没找到,就会返回-1

    #include<stdio.h>int order(int arr[], int len, int needFindNum) {for (int i = 0; i < len; i++){if (arr[i] == needFindNum){return i;}}return -1;}int main() {//1. 定义数组int arr[] = {11,22,33,44,55};int len = sizeof(arr) / sizeof(arr[0]);//2. 定义一个变量表示要查找的数据int num = 55;//3. main函数外定义一个方法进行顺序查找int index = order(arr,len,num);printf("%d\n", index);return 0;}


## 二分查找/折半查找
        - 前提条件:数组里得数据必须是有序的
        - 核心逻辑:每次排除一半的查找范围
        - 默认刚开始min是索引为0的值,max是索引为最大的那个值
        - 核心思路:
           1. min和max表示当前要查找的范围
           2. min是min和max中间的
           3. 如果要查找的值在mid的左边,缩小范围时,min不变,max等于mid - 1
           4. 如果要查找的值在mid的右边,缩小范围时,max不变,min等于mid + 1
             * 如果找到了,就会返回数据对应的索引
             * 如果没找到,就会返回-1

 #include<stdio.h>int binarySearch(int arr[], int len, int needFindNum) {//1确定要查找的范围int min = 0;int max = len - 1;//注意min,max,mid都是指索引while (min <= max) {int mid = min + (max - min)/ 2;//确定中间位置if (arr[mid] < needFindNum){min = mid + 1;}else if (arr[mid] > needFindNum){max = mid - 1;}else {return mid;}}return -1;}int main() {//折半查找/二分查找int arr[] = {11,22,33,44,55};int len = sizeof(arr) / sizeof(arr[0]);int num = 33;int index = binarySearch(arr, len, num);printf("要查找的值所在索引为:%d\n",index);return 0;}

## 插值查找
        - 要求:数据要有序,且数据分布尽可能得均匀分布一些
        - 优势:满足要求,效率比二分查找快,否则反而会更慢。
        - 和二分查找相比,mid尽可能得靠近要查找的数据,但是要求数据尽可能的分布均匀。
        - 代码和二分查找无异,就是把mid = (min + max)/2;  替换成:
       int mid = min + (needFindNum - arr[min]) / (arr[max] - arr[min]) * (max - min);


## 分块查找
        - 分块的原则1:前一块中的最大数据,小于后一块中所有的数据(块内无序,快间有序)
        - 分块的原则2:块数数量一般等于数字的个数开根号,比如:16个数字一般分为4块左右
        - 核心思路:先确定要查找的元素在哪一块,然后块内挨个查找
         * 面对无规律的数据,在进行分块时,确保每块数字无交集(哈希查找)


## 哈希查找
        - 在分块查找的核心思路上,面对的是无规律的数据,在进行分块时,确保每块数字无交集


## 冒泡排序
        - 核心逻辑:相邻的数据两两比较,小的放前面,大的放后面
        - 核心思路:
             1. 相邻的元素两两比较,大的放右边,小的放左边。(默认排成从小到大)
             2. 第一轮比较完毕之后,最大值就已经确定,第二轮以此类推。
             3. 如果数据中有n个数据,总共我们只要执行n-1轮的代码就可以了
  

#include<stdio.h>void bubbleSort(int arr[] , int len) {for (int j = 0; j < len - 1; j++){for (int i = 0; i < len - 1 - j; i++) {if (arr[i] > arr[i+1]){int temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;}}}}int main() {int arr[] = {55,56,33,11,22};int len = sizeof(arr) / sizeof(arr[0]);bubbleSort(arr, len);//遍历排完序后的数组for (int i = 0; i < len; i++){printf("%d ",arr[i]);}return 0;}


## 选择排序
        - 核心逻辑:从0索引开始,拿着每一个索引上的元素跟后面的元素依次比较,小的放前面,大的放后面,以此类推。
        - 核心思想:
          1. 从0索引开始,跟后面的元素进行一一比较
          2. 小的放前面,大的放后面
          3. 第一轮循环从0索引开始比较,结束后最小的数据已经确定
          4. 第二轮……以此类推
      

 #include<stdio.h>void selectSort(int arr[] ,int len) {for (int j = 0; j < len - 1; j++){for (int i = j + 1; i < len ;i++) {if (arr[j] > arr[i]){int temp = arr[j];arr[j] = arr[i];arr[i] = temp;}}}}int main() {int arr[] = { 55,56,33,11,22 };int len = sizeof(arr) / sizeof(arr[0]);selectSort(arr,len);//遍历排好序的数组for (int i = 0; i < len; i++){printf("%d ",arr[i]);}return 0;}


http://www.ppmy.cn/news/1576462.html

相关文章

UniApp 按钮组件 open-type 属性详解:功能、场景与平台差异

文章目录 引言一、open-type 基础概念1.1 核心作用1.2 通用使用模板 二、主流 open-type 值详解2.1 contact - 客服会话功能说明平台支持代码示例 2.2 share - 内容转发功能说明平台支持注意事项 2.3 getUserInfo - 获取用户信息功能说明平台支持代码示例 2.4 getPhoneNumber -…

P8680 [蓝桥杯 2019 省 B] 特别数的和

P8680 [蓝桥杯 2019 省 B] 特别数的和 - 洛谷 题目描述 小明对数位中含有2、0、1、9的数字很感兴趣&#xff08;不包括前导0&#xff09;&#xff0c;在1到40中这样的数包括1、2、9、10至32、39和40&#xff0c;共28个&#xff0c;他们的和是574。 请问&#xff0c;在1到n中&…

【Map vs Set】:Java数据存储的“双子星”对决

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 &#x1f370;一、搜索 &#x1f36e;1.概念 &#x1f36e;2.模型 &#x1f370;二、Map &#x1f368;1.什么是Map&#xff1f; &#x1f368;2.Map的实例化 &…

Suspense 使用方法

在这个组件树中有多个嵌套组件&#xff0c;要渲染出它们&#xff0c;首先得解析一些异步资源。如果没有 <Suspense>&#xff0c;则它们每个都需要处理自己的加载、报错和完成状态。在最坏的情况下&#xff0c;我们可能会在页面上看到三个旋转的加载态&#xff0c;在不同的…

版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点

版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点 引言正文定义坐标点的类绘图显示代码直接连接两个坐标点引言 由于人工智能的加速普及,每次手动绘制版图都会觉得特别繁琐,作者本人在想可否搞一个自动化连接器件端口的算法,后期可以根据一些设定的限制进行避…

P8654 [蓝桥杯 2017 国 C] 合根植物---并查集!!!

P8654 [蓝桥杯 2017 国 C] 合根植物---并查集&#xff01;&#xff01;&#xff01; 题目 并查集模板分析代码 题目 并查集模板 算法核心就是 1、查找 int find(int x) {if (d[x] x)return x;elsereturn d[x] find(d[x]);//注意这儿是一个赋值&#xff0c;不是判等//最终返…

kubernetes 初学命令

基础命令 kubectl 运维命令常用&#xff1a; #查看pod创建过程以及相关日志 kubectl describe pod pod-command -n dev #查看某个pod&#xff0c;以yaml格式展示结果 kubectl get pod nginx -o yaml #查看pod 详情 以及对应的集群IP地址 kubectl get pods -o wide 1. kubetc…

遇到liunx服务器IO负载,读IO流量峰值347MB/s,排查并解决。

前言&#xff1a; 根据监控报警看到IO读的速度为347MB/s。 统计时间区段 统计时长 IOPS IO流量 状态 1 工作日上班时间段&#xff1a;08:00-18:00 1小时平均值 >2000 >200 MB/s 异常 4小时平均值 >1500 >150 MB/s 异常 8小时平均值 >1000 >100 MB/s 异常…