【C语言督学训练营 第十六天】考研中常考的排序大题(上)---- 冒泡排序、插入排序、快速排序

news2024/9/23 23:35:20

文章目录

  • 前言
  • 经典的冒泡
  • 插入排序
  • 快速排序

前言

今天要介绍的部分是排序算法,在很久很久之前学习过十大排序,当时自我感觉非常良好,知道今天才知道我认为的大错特错。有些排序算法会考代码题,有些只会考小题只需要理解思想即可,目前介绍的几种排序算法均是喜欢考代码题的。
在这里插入图片描述

经典的冒泡

冒泡排序的基本思想是:从后往前(或从前往后)两两比较相邻元素的值,(若A[j-1]>A[j]),则交换它们,直到序列比较完。我们称它为第一趟冒泡,结果是将最小的元素交换到待排序列的第一个位置。关键字最小的元素如气泡一般逐渐往上“漂浮”直至“水面”。下一趟冒泡时,前一趟确定的最小元素不再参与比较,每趟冒泡的结果是把序列中的最小元素放到了序列的最终位置…这样最多做n–1趟冒泡就能把所有元素排好序。
在这里插入图片描述

冒泡排序很经典,在刚步入大学的时候学习的排序方法就是冒泡排序,它的排序过程就像气泡一样,每一次冒出一个当前无序部分最大的值如果有n个元素的话,需要冒泡n-1次;具体实现过程如下:
在这里插入图片描述
正是重复这个过程,最终使得序列有序。冒泡排序的实战代码如下:

//冒泡
//针对循环条件有下列解释
//一个数据一个数据向后冒泡(外层循环是一共需要排序的元素个数剩一个的时候就不用循环了)
//内层循环是两两相邻元素进行比较(后面已经排好i个元素了),当循环到倒数第二个元素时,整个数组都扫描过了
//冒泡思想:
//每次对比相邻两个元素,大的向后移,每循环一轮将会冒出当前最大元素。
//如此循环n-1轮便可以将整个序列变的有序。
void BubbleSort(int *p){
    for(int i=0;i<maxSize-1;i++){
        for (int j=0;j<maxSize-i-1;j++){
            if(p[j]>p[j+1]){
                int temp=p[j];
                p[j]=p[j+1];
                p[j+1]=temp;
            }
        }
    }
}

跟冒泡容易混淆的是选择排序(并不是指思想上混淆,而是代码上混淆,要多多注意!)

插入排序

插入排序分为三种

  • 直接插入排序
  • 折半插入排序
  • 希尔排序

以上3种插入类型的排序,考研都是考选择题,考大题概率很低,因此我们仅讲解直接插人排序的原理与代码实战,折半插入排序与希尔排序原理可以在后面的408课程中进行学习。
在这里插入图片描述

如果看文字有点吃力的话,可以看一看动画加深理解:记住一个事,就是将当前选择的元素插入到前面有序序列中的合适位置。
在这里插入图片描述

//插入
//针对插入排序循环条件
//外层是因为有可能第一个元素就是最大的,需要插入n-1次才能完成有序
//内层循环是因为要向前寻找可插入的位置,插入之前要先移动元素腾出位置
//当腾出位置之后在腾出的位置插入当前元素p[j+1]=temp;这么写的原因是
//p[j]不需要移动,而p[j+1]=p[j+2],p[j+1]就是我们要插入的位置
//针对算法思想:
//插入排序每一次选出一个元素,然后向序列头部方向寻找插入位置,因为要插入元素
//所以数组的话需要先移动元素,当找到合适的位置时将选出的元素插入,插入之后
//形成一个新的有序序列,然后寻找下一个元素可插入的位置,当有n-1个元素插入成功
//之后序列整体就变的有序了。
void InsertSort(int *p){
    for(int i=1;i<maxSize;i++){
        int temp=p[i];
        int j=i-1;
        while (j>=0&&p[j]>temp){
            p[j+1]=p[j];
            j--;
        }
        p[j+1]=temp;
    }
}

快速排序

快速排序的核心是分治思想:假设我们的目标依然是按从小到大的顺序排列,我们找到数组中的一个分割值,把比分割值小的数都放在数组的左边,把比分割值大的数都放在数组的右边,这样分割值的位置就被确定。数组一分为二,我们只需排前一半数组和后一半数组,复杂度直接减半。采用这种思想,不断地进行递归,最终分割得只剩一个元素时,整个序列自然就是有序的。


通俗点来说就是:每一次选一个元素,以这个元素为标准将序列分为两段,大的站一边,小的站一边,此时选中的元素在有序序列中位置已确定,剩余要做的工作就是划分生成的两段,直到将序列划分的只有一个元素,那么整体就是有序的(因为每一个元素都占到了有序情况下的合适位置)。


如果文字有些枯燥可以看一看动画:
在这里插入图片描述
下面是实战代码:
initFastSort是找到当前序列首元素在有序情况下的合适位置,遍历一遍序列即可,将元素拆分到两边。

//快速排序
//函数说明
//initFastSort函数负责将该段元素根据首元素划分为两段,并将首元素放在合适的位置
//使得首元素左边比其小右边比其大。(遍历一遍找出序列中一个元素的有序位置)
//FastSort函数的作用是将序列分而治之,每划分一次排序的次数就减半,当划分到只有一个元素在一组时
//排序顺势完成。
//算法思想
//解决掉要想让整体有序,需要先让每一段有序,当每一段有序之后整体就有序了。
int initFastSort(int *p,int l,int r){
    int temp=p[l];
    while(l<r){
        while (l<r&&p[r]>=temp)
            --r;
        p[l]=p[r];
        while (l<r&&p[l]<=temp)
            ++l;
        p[r]=p[l];
    }
    p[l]=temp;
    return l;
}
void FastSort(int *p,int l,int r){
    if(l<r){
        int mid=initFastSort(p,l,r);
        FastSort(p,l,mid-1);
        FastSort(p,mid+1,r);
    }
}
void StartFastSort(int *p){
    FastSort(p,0,maxSize-1);
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

火山引擎DataLeap数据质量解决方案和最佳实践(二):解决方案

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 DataLeap流批数据质量解决方案 产品功能架构 火山引擎DataLeap流批数据质量解决方案有 4 个大的功能&#xff1a; 离线数据质量监控&#xff1a;解决批和微批监控…

Spring Boot 中的 CD 工具

Spring Boot 中的 CD 工具 在现代软件开发中&#xff0c;持续交付&#xff08;Continuous Delivery&#xff0c;简称 CD&#xff09;已经成为了一个非常重要的开发模式。CD 工具可以帮助我们自动化构建、测试、部署和发布软件&#xff0c;提高软件交付的速度和质量。在 Spring…

接口增量改动,研发经常忘通知测试,如何解决?

不知道大家有没有同感&#xff0c;做接口测试麻烦的不是测试本身&#xff0c;而是接口它会变&#xff0c;更麻烦的不是接口变了&#xff0c;而是它变了而你不知道。等到你测完&#xff0c;开发才悠悠跟你说 ——“那个接口我改了点东西&#xff0c;你再看一眼哈”。 我那是看一…

el-menu嵌套路由高亮

1、配置路由 2、一级导航页面配置 计算属性定义方法 3、二级导航页面

mysql知识点总结

MySQL的binlog有有几种录入格式?分别有什么区别? 有三种格式,statement,row和mixed. statement模式下,记录单元为语句.即每一个sql造成的影响会记录.由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制. row级别…

环境变量编程

问题 main 函数 (默认进程入口) int main(int argc, char* argv[], char* env[]) argc - 命令行参数个数argv[] - 命令行参数数组env[] - 环境变量数组 (最后一个元素为 NULL) 什么是环境变量&#xff1f; 环境变量是进程运行过程中可能用到的 "键值对" (NAME VA…

使用Bert,ERNIE,进行中文文本分类

GitHub - 649453932/Bert-Chinese-Text-Classification-Pytorch: 使用Bert&#xff0c;ERNIE&#xff0c;进行中文文本分类使用Bert&#xff0c;ERNIE&#xff0c;进行中文文本分类. Contribute to 649453932/Bert-Chinese-Text-Classification-Pytorch development by creatin…

centos通过源文件的方式安装node-red

centos通过源文件的方式安装node-red 一、下载源文件1.1 查看系统信息1.2 下载 二、安装配置2.1 安装nodejs2.2 安装node-red 三、pm2管理node-red进程3.1 pm23.2 node-red设置开机自启动 四、更多 [回到目录] 一、下载源文件 1.1 查看系统信息 查看你的Linux系统是32位还是6…

三、1如何运用设计原则之SOLID原则写出高质量代码?

你好我是程序员雪球。接下来我们学习一些经典的设计原则。其中包括SOLID&#xff0c;KISS&#xff0c;YAGNI&#xff0c;DRY&#xff0c;LOD等。其实这些设计原则从字面意思理解并不难。但是“看懂”和“会用”是两回事&#xff0c;而“用好”就难上加难了。 先来了解SOLID原则…

EMC学习笔记(十三)背板的EMC设计

背板的EMC设计 1.背板槽位的排列1.1 单板信号的互联要求1.2 单板板位结构1.2.1 板位结构影响1.2.2 板间互联电平、驱动器件的选择 2.背板的EMC设计2.1 接插件的信号排布与EMC设计2.1.1 接插件的选型2.1.2 接插件模型与针信号排布 2.2 阻抗匹配2.3 电源、地分配 1.背板槽位的排列…

深度学习的技术原理

目录 人工智能 深度学习的应用场景 神经网络 卷积神经网络&#xff08;CNN&#xff09; 一个神经网络运行的可视化展示 人工智能 信息技术是人类历史上的第三次工业革命&#xff0c; 计算机、 互联网、智能家居等技术的普及极大地方便了人们的日常生活。 通过编程的方式&…

xshell安装jdk1.8环境

xshell安装jdk1.8环境 大家好&#xff0c;今天我们来学习一下xshell安装jdk1.8环境&#xff0c;好好看&#xff0c;好好学&#xff0c;超详细的 第一步 进入xshell官网下载 第二步 打开xshell新建一个会话&#xff0c;如下图&#xff1a; 第三步 输入你的名称、主机ip、端口号(…

Nginx负载均衡与动静分离

一、Nginx负载均衡&#xff1a; 1.概述&#xff1a; Nginx是一款http服务器软件&#xff0c;支持高达50000个并发连接数的响应。 &#xff08;1&#xff09;拥有强大的处理静态资源的能力。 &#xff08;2&#xff09;运行稳定。 &#xff08;3&#xff09;CPU&#xff0c…

nginx+tomcat负载均衡和动静分离

目录 1.部署nginx 2.部署两台tomcat 3.配置nginx 1.部署nginx vim /vim/lib/systemd/system/nginx.service 2.部署两台tomcat 进入第一台装第一个tomcat vim /etc/profile vim /usr/local/tomcat/webapps/test/index.jsp 重启 进入第二台安装第二台tomcat vim /usr/local/tom…

【电路原理学习笔记】第2章:电压、电流和电阻:2.1 原子结构

第2章&#xff1a;电压、电流和电阻 2.1 原子结构 元素&#xff1a;不能用化学方法分解成更简单形式的物质称为元素。原子&#xff1a;原子是体现元素特性的最小粒子。原子核&#xff1a;原子核由质子和中子组成&#xff0c;质子带有正电荷&#xff0c;中子呈中性。电子带有负…

原型模式的学习与使用

1、原型模式的学习 当我们需要创建一个对象&#xff0c;并且该对象的创建过程比较复杂或者耗时时&#xff0c;可以使用原型模式。原型模式通过复制现有对象的属性来创建新的对象&#xff0c;而不是从头开始创建。   在原型模式中&#xff0c;我们定义一个原型接口或抽象类&am…

CMU 15-445 -- Buffer Pool - 03

CMU 15-445 -- Buffer Pool - 03 引言Buffer PoolsBuffer Pool ManagerLock 和 Latch 的区别PAGE TABLE 和 PAGE DIRECTORYMultiple Buffer PoolsPrefetchingScan SharingBuffer Pool BypassOS Page Cache Buffer Replacement PoliciesLRUClockLRU 与 Clock 的问题LRU-KLocaliz…

如何优雅的将 Docker 镜像从 1.43G 瘦身到 22.4MB

Docker 镜像的大小对于系统的 CI/CD 等都有影响&#xff0c;尤其是云部署场景。我们在生产实践中都会做瘦身的操作&#xff0c;尽最大的可能使用 Size 小的镜像完成功能。下文是一个简单的 ReactJS 程序上线的瘦身体验&#xff0c;希望可以帮助大家找到镜像瘦身的方向和灵感。 …

Helm之深入浅出Kubernetes包管理工具使用

Chart 使用 作者:行癫(盗版必究) 一:Chart 模板使用 1.创建chart ​ templates目录包括了模板文件;当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates目录中;然后收集模板的结果并发送给Kubernetes ​ values.yaml 文件也导入到了模板;这个文件包含了c…

北京大学2016计算机学科夏令营上机考试

目录 A:分段函数【水题】 B:单词翻转【暴力不水】 C:反反复复【字符串】 D:文件结构“图”【图】 E:Exchange Rates【这不是我能做的】 F:Dungeon Master【没看懂题目什么意思】 G:重建二叉树【树】 A:分段函数【水题】 #include<iostream> using namespace std;…