【408篇】C语言笔记-第十四章( 二叉树的建树和遍历考研真题实战)

news2025/7/14 2:38:25

文章目录

    • 第一节:冒泡排序
      • 1. 排序
      • 2. 冒泡排序
    • 第二节:冒泡排序实战
      • 1. 步骤
      • 2. 代码
      • 3. 时间复杂度与空间复杂度
    • 第三节:快速排序原理与实战
      • 1. 基本思想
      • 2. 快速排序实战
      • 3. 时间复杂度与空间复杂度
    • 第四节:插入排序原理及实战
      • 1. 插入排序原理解析
      • 2. 代码实战
      • 3. 时间复杂度与空间复杂度

第一节:冒泡排序

1. 排序

排序算法分为交换类排序,插入类排序,选择类排序,归并类排序:

交换排序分为:1.冒泡排序。2.快速排序

2. 冒泡排序

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

动画演示:
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

第二节:冒泡排序实战

1. 步骤

随机生成10个元素->打印生成的元素顺序->通过冒泡排序对元素进行排序->再次打印元素顺序。

2. 代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef int ElemType;
typedef struct {
    ElemType *elem; // 整型指针
    int TableLen; // 存储动态数组里边元素的个数,相当于之前的len
}SSTable;

// 初始化链表
void ST_Init(SSTable &ST,int len){
    ST.TableLen=len;
    ST.elem= (ElemType*)malloc(sizeof(ElemType)*ST.TableLen);
    int i;
    srand(time(NULL));// 生成随机数
    for(i=0;i<ST.TableLen;i++){
        ST.elem[i]=rand()%100; // 为了让随机数在0-99之间
    }
}
// 打印
void ST_print(SSTable ST){
    for(int i=0;i<ST.TableLen;i++){
        printf("%3d",ST.elem[i]);// 和获取数组方法一样
    }
    printf("\n");
}
void swap(ElemType &a,ElemType &b){
    ElemType tmp;
    tmp=a;
    a=b;
    b=tmp;
}
// 冒泡排序
void BubbleSort(ElemType A[],int n){
    int i,j;
    bool flag;
    for(i=0;i<n-1;i++){ // i最多访问到8
        flag= false;
        for(j=n-1;j>i;j--){
            if(A[j-1]>A[j]){
                swap(A[j-1],A[j]);
                flag=true;
            }
        }
        if(flag==false){// 如果一趟比较没有发生任何交换,说明有序,提前结束排序
            return;
        }
    }
}
int main() {
    SSTable ST;
    ST_Init(ST,10);
    ST_print(ST);
    BubbleSort(ST.elem,10);
    ST_print(ST);
    return 0;
}
F:\Computer\Project\practice\16\16.4-Bubbling\cmake-build-debug\16_4_Bubbling.exe
 29 52 39 55 20 43 16 89 61  6
  6 16 20 29 39 43 52 55 61 89

进程已结束,退出代码为 0

3. 时间复杂度与空间复杂度

在这里插入图片描述

冒泡排序考研中以选择题为主

第三节:快速排序原理与实战

1. 基本思想

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

动画演示:
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

2. 快速排序实战

步骤:随机生成10个元素->打印生成的元素顺序->通过快速排序对元素进行排序->再次打印元素顺序。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef int ElemType;
typedef struct {
    ElemType *elem; // 整型指针
    int TableLen; // 存储动态数组里边元素的个数,相当于之前的len
}SSTable;

// 初始化链表
void ST_Init(SSTable &ST,int len){
    ST.TableLen=len;
    ST.elem= (ElemType*)malloc(sizeof(ElemType)*ST.TableLen);
    int i;
    srand(time(NULL));// 生成随机数
    for(i=0;i<ST.TableLen;i++){
        ST.elem[i]=rand()%100; // 为了让随机数在0-99之间
    }
}
// 打印
void ST_print(SSTable ST){
    for(int i=0;i<ST.TableLen;i++){
        printf("%3d",ST.elem[i]);// 和获取数组方法一样
    }
    printf("\n");
}

void swap(ElemType &a,ElemType &b){
    ElemType tmp;
    tmp=a;
    a=b;
    b=tmp;
}

int Partition(ElemType A[],int low,int high){
    ElemType pivot=A[low]; // 首先使用左边变量存储分割值
    while (low<high){
        while (low<high && A[high]>=pivot ){ // 从后往前遍历,找到一个比分割值小的
            high--;
        }
        A[low]=A[high]; // 把比分割值小的那个元素,当道A[low]
        while (low<high && A[low]<=pivot ){ // 从前往后遍历,找到一个比分割值大的
            low++;
        }
        A[high]=A[low]; // 把比分割值大的那个元素,放到A[high],因为刚才high位置的元素已经放到low位置了
    }
    A[low]=pivot;
    return low; // 返回分割值所在的下标
}

// 快速排序
void QuickSort(ElemType A[],int low,int high){
    if(low<high){
        int pivotpos=Partition(A,low,high); // 分割点左边的元素逗比分割点要小,右边的元素都比分割点大
//        printf("%d\n",pivotpos);
        QuickSort(A,low,pivotpos-1);
        QuickSort(A,pivotpos+1,high);
    }
}
int main() {
    SSTable ST;
    ST_Init(ST,10);
    ST_print(ST);
    QuickSort(ST.elem,0,9);
    ST_print(ST);
    return 0;
}
F:\Computer\Project\practice\16\16.6-quick\cmake-build-debug\16_6_quick.exe
 55 72 33 14 44 48 47 97 73 39
 14 33 39 44 47 48 55 72 73 97

进程已结束,退出代码为 0

3. 时间复杂度与空间复杂度

最好和平均时间复杂度为O( n l o g 2 n nlog_2 n nlog2n),最差为O( n 2 n^2 n2)

空间复杂度是O( l o g 2 n log_2 n log2n),因为递归的次数是 l o g 2 n log_2 n log2n,而每次递归的形参都是需要占用空间的。

快速排序考研中大题概率较高

第四节:插入排序原理及实战

1. 插入排序原理解析

插入排序分为:1.直接插入排序。2.折半插入排序。3.希尔排序。

考研选择题为主

这里只讲直接插入排序的原理和实战。

如果一个序列只有一个数,那么该序列自然是有序的。插入序列首先将第一个数视为有序序列,然后把后面9个数视为依次要插入的序列。首先,我们通过外层循环控制要插入的数,用insertVal保存要插入的值87,我们比较arr[0]是否大于arr[1],即3是否大于87,由于不大于,因此不发生移动,这时有序序列是3,87。接着,将数值2插入有序序列,首先将2赋给insertVal,这时判断87是否大于2,因为87大于2,所以将87向后移动,将2覆盖,然后判断3是否大于2,因为3大于2,所以3移动到原来87的位置。内层循环结束,这时将2赋给arr[0],也就是原来3的位置。继续循环会将数依次插入有序序列,最终使整个数组有序。

动画演示:
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

2. 代码实战

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef int ElemType;
typedef struct {
    ElemType *elem; // 整型指针
    int TableLen; // 存储动态数组里边元素的个数,相当于之前的len
}SSTable;

// 初始化链表
void ST_Init(SSTable &ST,int len){
    ST.TableLen=len;
    ST.elem= (ElemType*)malloc(sizeof(ElemType)*ST.TableLen);
    int i;
    srand(time(NULL));// 生成随机数
    for(i=0;i<ST.TableLen;i++){
        ST.elem[i]=rand()%100; // 为了让随机数在0-99之间
    }
}
// 打印
void ST_print(SSTable ST){
    for(int i=0;i<ST.TableLen;i++){
        printf("%3d",ST.elem[i]);// 和获取数组方法一样
    }
    printf("\n");
}

// 插入排序
void InsertSort(ElemType *arr,int n){
    int i,j,insertVal;
    for(i=1;i<n;i++){ // 外层控制要插入的数
        insertVal=arr[i]; // 先保存要插入的值
        for(j=i-1;j>=0&&arr[j]>insertVal;j--){ // 内层控制比较j要大于等于0,同时arr[j]大于insertval,arr[j]位置元素往后覆盖
            arr[j+1]=arr[j];
        }
        arr[j+1]=insertVal;
    }
}
int main() {
    SSTable ST;
    ST_Init(ST,10);
    ST_print(ST);
    InsertSort(ST.elem,10);
    ST_print(ST);
    return 0;
}
F:\Computer\Project\practice\16\16.7-insert\cmake-build-debug\16_7_insert.exe
 19 41 89 67  1 57 57 15 53 66
  1 15 19 41 53 57 57 66 67 89

进程已结束,退出代码为 0

3. 时间复杂度与空间复杂度

随着有序序列不断增加,插入排序比较的次数也会增加,插入排序的执行次数也是从1加到n-1,总运行次数为n(n-1)/2,所以时间复杂度为O( n 2 n^2 n2)。因为未使用额外的空间,所以空间复杂度为O(1)。

如果数组本身有序,那么最好的时间复杂度是O(n)。

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

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

相关文章

HSF 实现原理

HSF 实现原理 提供服务的流程 - server启动时候向ConfigServer注册 - client启动时候向ConfigServer请求list - client缓存list&#xff0c;发现不可用的server&#xff0c;从缓存中remove - ConfigServer通过心跳包维护可用server的list - list有更新的时候&#xff0c;…

单片机——LED

0. 单片机编程的一般步骤 目标分析&#xff1a;点亮开发板上的LED灯 电路原理图分析&#xff1a;相关器件的工作原理 数据手册分析&#xff1a;IO端口控制 代码编写、编译 下载与调试 1. LED简介 Led&#xff1a;即发光二极管&#xff0c;具有单向导通性&#xff0c;一般…

验证码、通知短信API常见使用问题

如今短信应用于我们生活工作的方方面面&#xff0c;注册或者登录一个应用可以用短信验证码快速登录&#xff0c;支付可以使用短信验证码&#xff1b;商家搞促销活动可以发送通知短信给客户&#xff0c;会员到期了商家可以发送告警短信给会员用户…可见验证码短信API和通知短信A…

JavaFX爱好者看过来,这款工具值得拥有

前言 各位CSDN的博友们&#xff0c;随着各地政策的放开&#xff0c;大伙现在是在水深火热当中呢&#xff1f;还是天选打工人-安然无羊。在这里&#xff0c;希望阳了的朋友&#xff0c;赶紧恢复健康&#xff0c;早日康复。希望没有阳的朋友们&#xff0c;继续坚持&#xff0c;万…

聊聊设计模式-解释器模式?

简介 解释器模式属于行为型模式。它是指给定一门语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子。是一种按照规定的语法进行解析的模式 编译器可以将源码编译解释为机器码&#xff0c;让CPU能进行识别并…

C++调用matlab引擎画三维图

VS2012设置 项目–项目属性–配置属性–VC目录–包含目录 D:\MATLAB\R2016a\extern\include 项目–项目属性–配置属性–VC目录–库目录 D:\MATLAB\R2016a\extern\lib\win64\microsoft 添加依赖项有两种方法&#xff1a; 方法一&#xff1a;项目中设置 项目–项目属性–配置属…

一、线程相关概念

文章目录相关概念程序(program)进程线程单线程与多线程并发与并行相关概念 程序(program) 是为完成特定任务、用某种语言编写的一组指令的集合。简单的说:就是我们写的代码。 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c…

基于注解方式Spring Security忽略拦截

文章目录1.Spring Security忽略拦截配置2.基于配置文件注入2.1.添加配置2.2.修改Spring Security配置类2.3. 测试3.基于注解的方式过滤接口3.1.添加注解3.2.获取所有使用了IgnoreWebSecurity注解的接口访问路径3.3.测试1.Spring Security忽略拦截配置 关于Spring Securite的使…

SDL学习

学习笔记&#xff1a;整合安全开发生命周期SDL的Devops工具链建设 分享思路&#xff1a;《SDL安全开发生命周期介绍》 1、什么是SDL&#xff1f; 2、为什么需要SDL&#xff1f; 3、DevSecOps实践&#xff08;SDLDevOps&#xff09; 【整合安全开发生命周期SDL的DevOps工具链建…

408 考研《操作系统》第三章第一节:内存

文章目录教程1. 内存的基础知识1.1什么是内存&#xff1f;有何作用&#xff1f;补充知识&#xff1a;几个常用的数量单位2. 进程的运行原理2.1 指令的工作原理2.2 逻辑地址vs物理地址2.3 从写程序到程序运行2.4 装入模块装入内存2.5 装入的三种方式2.5.1 ——绝对装入2.5.2 ——…

VR的内容荒漠,字节救不了

文|智能相对论 作者|Kinki 去年以来&#xff0c;“元宇宙”概念大火&#xff0c;掀起了新一轮的产业布局和科技博弈&#xff0c;脸书Facebook更直接改名Meta&#xff0c;展示其看好元宇宙未来的决心&#xff0c;国内大厂如腾讯、字节、阿里等&#xff0c;也在游戏、社交、硬件…

Macos安装和卸载第三方软件的正确方法

Mac第三方软件通常指的是非MacApp Store渠道下载安装的应用程序。在Mac电脑中有很多Mac系统内置的软件&#xff0c;但有些用户也喜欢安装一些第三方的软件来提高工作效率&#xff0c;那么我们如何正确的安装和卸载第三方软件呢&#xff1f;教程都在下面哦~ mac第三方软件安装方…

Fabric.js 使用图片遮盖画布(前景图)

本文简介 点赞 关注 收藏 学会了 在 《Fabric.js 使用纯色遮挡画布》 中讲到使用纯色的方式遮盖画布。如果你的常见需要使用图片来遮盖的话&#xff0c;fabric.js 也提供了相应的属性来配置。 相比起使用纯色遮盖画布&#xff0c;使用图片会更复杂。 因为图片本身是有尺寸…

【科研工具】一款好用的科研插件-easyScholar

0.概述1.安装2.功能显示SCI分区&#xff1a;定位优质的文献【看分区排名靠前的1-2区】选中英文按下t翻译&#xff0c;按下y隐藏翻译点击文献网址的图标跳转sci-hub下载0.概述 easyScholar是一款很好用的科研插件&#xff0c;可以显示会议期刊登记&#xff0c;支持轻量翻译&…

SAP OData 服务关于本地文件作为附件上传的一些错误消息

错误消息&#xff1a; {"error": {"code": "005056A509B11EE3AEB5819C07C69E2F","message": {"lang": "en","value": "The server is refusing to process the request because the entity has a…

单机模拟主从复制(一主三从)

引言 操作系统环境&#xff1a;Ubuntu 20.04 Redis版本&#xff1a;6.2.8 准备工作 官网下载 当前最新版本是7.0&#xff0c;我这里用的是6.0&#xff0c;下载 redis-6.2.8.tar.gz&#xff0c;拷贝到自己的虚拟机或者云服务器。 tar -zxvf redis-6.2.8.tar.gz 解压 cd redi…

【HAL库】STM32CubeMX开发----STM32F407----SPI实验

前言 本次实验以 STM32F407VET6 芯片为MCU&#xff0c;使用 25MHz 外部时钟源。 SPI 通信引脚 与 MCU引脚 对应关系如下&#xff1a; SPI接口GPIO端口CS(片选)PA4SCLK(时钟)PA5MISO(数据输入)PA6MOSI(数据输出)PA7 一、使用STM32CubeMX ---- 新建SPI实验工程 步骤1&#xff…

crypto-music is frequency(INS‘hAck CTF 2018)

比较有趣的一题&#xff0c;记录下来。 Music is frequency Passionated by the sound of a nursery rhyme, we decided to build a new way to send private messages. Find a way to decrypt our rsa private key to get your reward. Because we are pretty bad musicians, …

postgres 源码解析46 可见性映射表VM

简介 Postgres 为实现多版本并发控制技术&#xff0c;当事务删除或者更新元组时&#xff0c;并非从物理上进行删除&#xff0c;而是将其进行逻辑删除[具体实现通过设置元组头信息xmax/infomask等标志位信息],随着业务的累增&#xff0c;表会越来越膨胀&#xff0c;对于执行计划…

【QScrollBar | QSlider | QDial | QProgressBar | QLCDNumber】

【QScrollBar | QSlider | QDial | QProgressBar | QLCDNumber】【1】UI设计界面【QScrollBar | QSlider 函数学习】【2】setMinimum | setMaximum【3】setSingleStep【4】setPageStep【5】setValue【6】setSliderPosition【7】setTracking【8】setOrientation【9】setInverted…