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

# 数组的常见算法
    - 查找算法
       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;
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980473.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络入门】初学计算机网络(六)

目录 1.回忆数据链路层作用 2. 组帧 2.1 四种组帧方法 2.1.1 字符计数法 2.1.2 字节填充法 2.1.3 零比特填充法 2.1.4 违规编码法 3. 差错控制 3.1 检错编码 3.1.1 奇偶校验码 3.1.2 CRC&#xff08;循环冗余校验&#xff09;校验码 3.2 纠错编码 3.2.1 海明校验码…

Materials Studio MS2020在linux系统上的安装包下载地址 支持centos Ubuntu rocky等系统

下载地址&#xff1a;MS2020-linux官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 Materials Studio 2020是一款功能强大的材料科学计算模拟软件&#xff0c;以下是其详细介绍&#xff1a; 核心模块功能 CASTEP模块&#xff1a;采用平面波赝势方法&#xff0c;适用于周…

JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录 一、引言二、什么是 JSON Schema&#xff1f;三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例&#xff1a;定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…

初探Ollama与deepseek

什么是Ollama&#xff1f;它与大模型有什么联系&#xff1f; 简单说&#xff0c;Ollama就像是你电脑上的一个 “大模型小助手”。 以前&#xff0c;很多强大的大语言模型&#xff0c;比如能回答各种问题、写文章、翻译等的那些模型&#xff0c;要么只能在网上的服务器上用&am…

【word】保存重开题注/交叉引用消失,全局更新域问题

目录 一、更新域是什么二、更新域常见问题及解决方法&#xff08;一&#xff09;更新域后内容未变化&#xff08;二&#xff09;域代码显示异常&#xff08;三&#xff09;交叉引用无法更新&#xff08;四&#xff09;全选更新域出现错误 三、交叉引用与题注的关系及操作&#…

区块链中的数字签名:安全性与可信度的核心

数字签名是区块链技术的信任基石&#xff0c;它像区块链世界的身份证和防伪标签&#xff0c;确保每一笔交易的真实性、完整性和不可抵赖性。本文会用通俗的语言&#xff0c;带你彻底搞懂区块链中的数字签名&#xff01; 文章目录 1. 数字签名是什么&#xff1f;从现实世界到区块…

人工智能之数学基础:矩阵的范数

本文重点 在前面课程中,我们学习了向量的范数,在矩阵中也有范数,本文来学习一下。矩阵的范数对于分析线性映射函数的特性有重要的作用。 矩阵范数的本质 矩阵范数是一种映射,它将一个矩阵映射到一个非负实数。 矩阵的范数 前面我们学习了向量的范数,只有当满足几个条…

【MySQL】数据库初识

目录 一、什么是数据库 与数据结构的区别 各类软件&#xff08;数据库&#xff09;代表 关系型 vs 非关系型 关系型数据库 非关系型数据库 二、初识MySQL数据库 三、MySQL数据库安装 四、常用数据类型 内存 vs 硬盘 数值类型 字符串类型 日期类型 五、MySQL数据库…

Minio文件存储及Springboot集成

文章目录 Minio简介Minio安装使用下载Minio.exe启动访问WebUI MinIO基本概念Spingboot集成Minio设置本地Minio访问秘钥创建文件存储bucket项目pom.xml添加依赖配置文件修改Minio配置类Minio工具类定义HttpStatus定义统一返回结果定义controller类 总结 Minio简介 MinIO 是高性…

P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用

P8651 [P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用 题目 分析代码 题目 分析 代码中巧妙的用到3重循环&#xff0c;完美的解决了输出的顺序问题【题目要求从小到大】 需要注意的是2月的值&#xff0c;在不同的年份中应该更新2月的值 还有…

蓝桥杯练习代码

一、最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], targe…

Go中slice和map引用传递误区

背景 关于slice和map是指传递还是引用传递&#xff0c;很多文章都分析得模棱两可&#xff0c;其实在Go中只有值传递&#xff0c;但是很多情况下是因为分不清slice和map的底层实现&#xff0c;所以导致很多人在这一块产生疑惑&#xff0c;下面通过代码案例分析slice和map到底是…

DeepSeek如何快速开发PDF转Word软件

一、引言 如今&#xff0c;在线工具的普及让PDF转Word成为了一个常见需求&#xff0c;常见的PDF转Word工具有收费的WPS&#xff0c;免费的有PDFGear&#xff0c;以及在线工具SmallPDF、iLovePDF、24PDF等。然而&#xff0c;大多数免费在线转换工具存在严重隐私风险——文件需上…

perf(es5-widget): es5-widget.js文件优化时间戳生成逻辑

这个文件内部分代码逻辑推荐语法&#xff1a; cacheVersion widgetcfg.versionif (cacheVersion "time") {cacheVersion Date.now ? Date.now() : new Date().getTime(); } 改善优化 后续更新对应代码行 perf(es5-widget): 优化时间戳生成逻辑 将 "&quo…

【语法】C++中string类中的两个问题及解答

贴主在学习string类时遇到过两个困扰我的问题&#xff0c;今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中&#xff0c;调用的是这个string对象的容量(可以存多少个有效字符)&#xff0c;而size()是调用的string对象现在有…

Android 应用开发中,证书、签名和加固简述

目录 一、应用证书&#xff08;Digital Certificate&#xff09; 二、应用签名&#xff08;APK Signing&#xff09; 三、应用加固&#xff08;Obfuscation & Protection&#xff09; 三者的关系与协同 实际应用场景 总结 四、V1、V2、V3 签名方案的区别 1. V1 签名…

SpringMVC学习(初识与复习Web程序的工作流程)(1)

目录 一、SpringMVC(框架)的简要概述。 &#xff08;1&#xff09;SpringMVC与Servlet。 &#xff08;2&#xff09;技术方向。 &#xff08;3&#xff09;最终学习目标。 二、Web程序的基本工作流程。 &#xff08;1&#xff09;工作流程。 <1>浏览器。前后端任务。 <…

yunedit-post ,api测试比postman更好

postman应该是大家最熟悉的api测试软件了&#xff0c;但是由于它是外国软件&#xff0c;使用它的高端功能注册和缴费都比较麻烦。生成在线文档分享也经常无法访问被拦截掉。 这里可以推荐一下yunedit-post&#xff0c;该有的功能都有。 https://www.yunedit.com/postdetail …

DeepSeek 助力 Vue3 开发:打造丝滑的悬浮按钮(Floating Action Button)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

基因枷锁下的太空梦 —— 千钧一发电影观后感

目录 1 人物介绍 2 电影名解读 3 电影开头 3.1 电影开头的两段话 3.2 片头设计 4 电影正文 4.1 “杰罗米”各种诡异的行为 4.2 文森特 – 失败的man 4.3 真正的杰罗米以及假基因身份证 4.4 文森特新征程 4.5 基因人的不容易 4.6 睫毛被查出有问题 4.7 文森特身份初…