排序(1)
排序(1)
日常生活中,有很多场景都会用到排序。比如你买东西,在购物软件就有几种展现方式,按照评论数量给你排序出来,让你选,还是说按照价钱高低排序出来让你选。
排序其实是一种为了更好解决问题的手段,就像你想问题,思绪混乱的时候,是不是得捋一捋,这捋一捋就是排序。排序在我看来主要作用就是:为了让一个看起来比较混乱的问题变成一个相对明晰的问题,去我们更好的解决问题。
那么排序方式多种多样,那么我们就要去学习各种各样的排序,去帮助我们在不同问题,不同情境下选择一个合适的排序。
冒泡排序
算法原理
冒泡排序的核心原理是通过相邻元素的比较和交换,使较大(或较小)的元素逐渐 “浮” 到数列的一端。具体步骤如下:
- 比较相邻元素:从数列的第一个元素开始,将相邻的两个元素进行比较。
- 交换元素位置:如果顺序错误(如升序排列时前一个元素比后一个大),则交换这两个元素的位置。
- 重复步骤 1 和 2:对数列中的每一对相邻元素重复上述比较和交换操作,直到最后一对。经过一轮比较和交换后,最大(或最小)的元素会被排到数列的末尾。
- 缩小比较范围:排除已经排好序的元素,对剩余未排序的元素重复上述步骤,直到整个数列都有序。
//冒泡排序
void BubbleSort(int *a,int n)
{for(int j=0;j<n;j++){int change=0;for(int i=1;i<n-j;i++){if(a[i-1]>a[i]){Swap(&a[i-1],&a[i]);change=1;}}if(change==0)break;}}
优缺点
- 优点:实现简单,代码容易理解,适用于小规模数据的排序。
- 缺点:时间复杂度较高,在处理大规模数据时效率较低。
直接插入排序
算法原理
直接插入排序的实现步骤如下:(就像斗地主的时候对牌进行排序,类似,就是拿后面的牌和前面的牌比大小,小的就往前面去,大的往后面去)
- 初始状态:把数组的第一个元素视为一个已排序的子序列,从第二个元素开始,将其作为待插入元素。
- 查找插入位置:将待插入元素与已排序子序列中的元素从后往前依次比较,找到合适的插入位置。
- 移动元素:若待插入元素小于已排序子序列中的某个元素,则将该元素及其后面的元素依次向后移动一位,为待插入元素腾出位置。
- 插入元素:把待插入元素放到合适的位置。
- 重复步骤 2 - 4:对数组中的每个元素重复上述操作,直到整个数组有序。
//直接插入排序
void InsertSort(int *a,int n)
{for(int i=0;i<n-1;i++){int end=i;int tmp=a[end+1];while(end>=0){if(a[end]>tmp){a[end+1]=a[end];}else{break;}end--;}a[end+1]=tmp;}
}
复杂度分析
- 时间复杂度:
- 最好情况:数组已经有序,此时每个元素只需要和前一个元素比较一次,不需要移动元素,时间复杂度为 (O(n)),其中 n 是数组的长度。
- 最坏情况:数组是逆序的,对于每个元素,都需要将其插入到已排序子序列的最前面,每次插入都需要移动已排序子序列中的所有元素,时间复杂度为 (O(n^2))。
- 平均情况:平均时间复杂度为 (O(n^2))。
- 空间复杂度:直接插入排序只需要常数级的额外空间,因此空间复杂度为 (O(1))。
希尔排序
主播个人的理解,对于希尔排序来说,其实就是直接排序,没那么多有的没的。这个东西,用的就是直接插入排序这个东西,但是呢,它厉害就厉害在,它把一次直接插入排序,换成若干次,哎呀我去,比直接插入排序效果好太多了。
这有点像啥,主播最近晾衣服,主播洗完烘干发现没完全干,就想着拿去外面晾晒。之前我都是直接洗完,然后用衣架把衣服穿好之后,一口气把衣服挂在杆子上量,你们应该知道,一堆衣服加上水,加上衣架的重量吧。
不过由于主播这里最近回南天,下暴雨,不敢晾衣服在外面,然后烘干。结果发现没完全干,我是用衣架穿好了一些衣服才发现的,觉得不行,得拿出去吹一吹,然后我就分次,本来一大堆的衣服一次性挂外面凉,现在我是分了3次挂出去,每次挂一些,诶,你还真别说,我觉得老轻松了。虽然是烘干水了,但是你收衣服一次性把所有衣服收完,之后一次性全部拿回放衣柜,也是很重的,你分几次来就会轻松一些。
这大概就是希尔排序,虽然不太恰当,但是意思就是这个意思。有点大任务分成小任务的意思。每次小任务都用的直接插入排序。
希尔排序呢,主要是把大任务分成小任务,没做完一次小任务,都离最终的结果进一点,每次一点,直到最后整合答案的时候,答案其实已经写好99%了,这就有点像你写数学题,最后一个:综上所诉……,就是这样。
//希尔排序
void ShellSort(int *a,int n)
{int gap=n;while(gap>1){gap=gap/3+1;for(int i=0;i<n-gap;i++){int end=i;int tmp=a[end+gap];while(end>=0){if(a[end]>tmp){a[end+gap]=a[end];end-=gap;}else{break;}}a[end+gap]=tmp;}}
}
结合以上所讲的,应该可以比较好的理解上面给出来的代码了。复杂度分析比较难,毕竟是数学问题了,而且还没有被解决,只是根据一些资料来看是O(N^1.3)。其实只要理解好直接插入排序,希尔排序并不难的。
选择排序
选择排序就很无脑了,选择排序就是遍历一遍数组找到一个最大值,放到数组后面,每次遍历都找到一个最大值。
比如4321,遍历一次变成3214,再遍历一次变成2134,直到1234 。不过这里可以做个优化,每次遍历把最小的也找到,如4321,遍历一次就是1324,再遍历一次就是1234了。
void SelectSort(int *a,int n)
{int begin = 0, end = n - 1;while (begin < end){// [begin, end]int mini = begin, maxi = begin;for (int i = begin+1; i <= end; i++){if (a[i] > a[maxi]){maxi = i;}if (a[i] < a[mini]){mini = i;}}Swap(&a[begin], &a[mini]);// max如果被换走了,修正一下//如例子4321if (maxi == begin){maxi = mini;}Swap(&a[end], &a[maxi]);++begin;--end;}
}
大家用一个简单的例子套一下就明白了。
还有一个堆排序,这个我在讲二叉树(堆)的时候已经讲了,就不赘述了
整体的代码:
sort.h
#include <stdio.h>
#include<time.h>
#include<stdlib.h>
//打印数组
void PrintArray(int *a,int n);//交换函数
void Swap(int *x,int *y);//冒泡排序
void BubbleSort(int *a,int n);//直接插入排序
void InsertSort(int *a,int n);
//希尔排序
void ShellSort(int *a,int n);//选择排序
void SelectSort(int *a,int n);
sort.c
#include "sort.h"//打印数组
void PrintArray(int *a,int n)
{for(int i=0;i<n;i++){printf("%d ",a[i]);}printf("\n");
}
//交换函数
void Swap(int *x,int *y)
{int tmp=*x;*x=*y;*y=tmp;
}
//冒泡排序
void BubbleSort(int *a,int n)
{for(int j=0;j<n;j++){int change=0;for(int i=1;i<n-j;i++){if(a[i-1]>a[i]){Swap(&a[i-1],&a[i]);change=1;}}if(change==0)break;}}//直接插入排序
void InsertSort(int *a,int n)
{for(int i=0;i<n-1;i++){int end=i;int tmp=a[end+1];while(end>=0){if(a[end]>tmp){a[end+1]=a[end];}else{break;}end--;}a[end+1]=tmp;}
}//希尔排序
void ShellSort(int *a,int n)
{int gap=n;while(gap>1){gap=gap/3+1;for(int i=0;i<n-gap;i++){int end=i;int tmp=a[end+gap];while(end>=0){if(a[end]>tmp){a[end+gap]=a[end];end-=gap;}else{break;}}a[end+gap]=tmp;}}
}
//选择排序
void SelectSort(int *a,int n)
{int begin = 0, end = n - 1;while (begin < end){// [begin, end]int mini = begin, maxi = begin;for (int i = begin+1; i <= end; i++){if (a[i] > a[maxi]){maxi = i;}if (a[i] < a[mini]){mini = i;}}Swap(&a[begin], &a[mini]);// max如果被换走了,修正一下if (maxi == begin){maxi = mini;}Swap(&a[end], &a[maxi]);++begin;--end;}
}
test.c
#include "sort.h"void TestBubbleSort()
{int a[]={8,9,6,1,3,2,5,7,10,4};BubbleSort(a,sizeof (a)/sizeof (int));PrintArray(a, sizeof(a)/ sizeof(int));
}
void TestInsertSort()
{int a[]={8,9,6,1,3,2,5,7,10,4};InsertSort(a,sizeof (a)/sizeof (int));PrintArray(a, sizeof(a)/ sizeof(int));
}
void TestShellSort()
{int a[]={8,9,6,1,3,2,5,7,10,4};int b[]={7,6,5,4,3,2,1};ShellSort(b,sizeof (b)/sizeof (int));PrintArray(b, sizeof(b)/ sizeof(int));
}
void TestSelectSort()
{int a[]={8,9,6,1,3,2,5,7,10,4};int b[]={7,6,5,4,3,2,1};SelectSort(a,sizeof (a)/sizeof (int));PrintArray(a, sizeof(a)/ sizeof(int));
}int main()
{//TestBubbleSort();//TestInsertSort();//TestShellSort();TestSelectSort();
}
还有一个测试代码,就是测试效率的,大家可以自己试试
#include "sort.h"void TestOP()
{srand(time(0));const int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);int* a3 = (int*)malloc(sizeof(int) * N);//int* a4 = (int*)malloc(sizeof(int) * N);//int* a5 = (int*)malloc(sizeof(int) * N);//int* a6 = (int*)malloc(sizeof(int) * N);int* a7 = (int*)malloc(sizeof(int) * N);for (int i = N-1; i >= 0; --i){a1[i] = rand();a2[i] = a1[i];a3[i] = a1[i];//a4[i] = a1[i];//a5[i] = a1[i];//a6[i] = a1[i];a7[i] = a1[i];}int begin1 = clock();InsertSort(a1, N);int end1 = clock();int begin2 = clock();ShellSort(a2, N);int end2 = clock();int begin7 = clock();BubbleSort(a7, N);int end7 = clock();int begin3 = clock();SelectSort(a3, N);int end3 = clock();int begin4 = clock();//HeapSort(a4, N);int end4 = clock();int begin5 = clock();//QuickSort(a5, 0, N - 1);int end5 = clock();int begin6 = clock();//MergeSort(a6, N);int end6 = clock();printf("InsertSort:%d\n", end1 - begin1);printf("ShellSort:%d\n", end2 - begin2);printf("BubbleSort:%d\n", end7 - begin7);printf("SelectSort:%d\n", end3 - begin3);printf("HeapSort:%d\n", end4 - begin4);printf("QuickSort:%d\n", end5 - begin5);printf("MergeSort:%d\n", end6 - begin6);free(a1);free(a2);free(a3);//free(a4);//free(a5);//free(a6);free(a7);
}int main()
{//TestBubbleSort();//TestInsertSort();//TestShellSort();//TestSelectSort();TestOP();
}
这里运行效率结果,数字越大,说明时间越久,效率越低下。
相关文章:
排序(1)
排序(1) 日常生活中,有很多场景都会用到排序。比如你买东西,在购物软件就有几种展现方式,按照评论数量给你排序出来,让你选,还是说按照价钱高低排序出来让你选。 排序其实是一种为了更好解决问…...
NR 5G中的N5接口
N5接口的定义: Reference point between the PCF and an AF or TSN AF. 即N5 PCF和AF之间的参考点。 AF Application Function 应用功能,指应用层的各种服务,可以是运营商内部的应用如Volte AF(类似4G的Volte As)、也可以是第三方的AF&…...
STM32自学进阶指南:从入门到精通的成长路径 | 零基础入门STM32第九十九步
主题内容教学目的/扩展视频自学指导通过数据手册和搜索引擎查找资料,独立解决问题以积累经验和提升能力。自学过程中应保持敬畏之心,不断总结未知领域,持续进步。师从洋桃电子,杜洋老师 📑文章目录 一、自学指导全景图1.1 学习路线对比1.2 关键学习策略二、待探索技术领域…...
利用 Python 进行股票数据可视化分析
在金融市场中,股票数据的可视化分析对于投资者和分析师来说至关重要。通过可视化,我们可以更直观地观察股票价格的走势、交易量的变化以及不同股票之间的相关性等。 Python 作为一种功能强大的编程语言,拥有丰富的数据处理和可视化库…...
用 Vue.js 构建基础购物车:从 0 到 1 的实战解析
在当今数字化购物的浪潮中,购物车功能已成为电商平台不可或缺的一部分。它不仅承担着记录用户所选商品的重任,还需提供流畅的交互体验和精准的计算逻辑。本文将深入探讨如何利用 Vue.js 这一强大的 JavaScript 框架,逐步搭建一个基础但功能完…...
MapSet常用的集合类(二叉搜索树,哈希表)
Set集合 Set的核心特点: Set继承了Collection。 保存的元素不会重复。 保存的元素不能修改。 保存的元素无序,和List不同,如果有两个:List {1,2,3},List {2,1,3}&…...
五种IO模型
1、通信的本质: 通过网络通信的学习,我们能够理解网络通信的本质是进程间通信,而进程间通信的本质就是IO。 IO也就是input和output。当读取条件不满足的时候,recv会阻塞。write写入数据时,会将数据拷贝到缓冲区中&am…...
路由器开启QOS和UPNP的作用
QOS 的作用 保障关键业务带宽:可根据网络应用的重要性分配带宽。比如在家庭网络中,当多人同时使用网络时,将视频会议等实时性要求高的关键业务设置为高优先级,确保其能获得足够带宽,避免卡顿,而文件下载等…...
学习MySQL的第九天
纸上得来终觉浅 绝知此事要躬行 数据处理的增删查改 一、添加数据 添加数据有两种方式,一种是一条一条的添加数据,另一种是通过对其他表的查询,将查询的结果插入到表中;第一种方式又可以分为三种方式:…...
怎么免费下载GLTF/GLB格式模型文件,还可以在线编辑修改
现在非常流行glb格式模型,和gltf格式文件,可是之类模型网站非常非常少 1,咱们先直接打开http://glbxz.com 官方glb下载网站 glbxz.com 2 可以搜索,自己想要的模型关键词 3,到自己想下载素材页面 4,…...
高效数据拷贝方法总结
1.系统/语言层面的高效拷贝 内存拷贝优化 使用memcpy(C/C)或类似函数进行大块内存拷贝 利用SIMD指令(如AVX/SSE)进行向量化拷贝 2.零拷贝技术 文件映射(mmap) - 将文件映射到内存空间 发送文件描述符而非数据本身(Unix域套接字) 使用sendfile系统调用(文件到套接字直接传…...
C 语言 第八章 文件操作
目录 文件操作 文件和流的介绍 C 输入 & 输出 C 文件的读写 创建/打开文件 写入文件 fputc 函数 fputs 函数 fprintf 函数 实例: 读取文件 fgets函数 实例: 关闭文件 文件操作 文件和流的介绍 变量、数组、结构体等数据在运行时存储于内存…...
开发一款游戏需要哪些岗位角色参与?
常见分类 1. 游戏策划(Game Designer) 核心职责:设计游戏的玩法、规则、内容和整体体验。 具体工作: 系统设计:设计游戏的战斗、经济、成长、社交等核心系统。 数值设计:平衡角色属性、装备数值、经济系…...
大模型面经 | 手撕多头注意力机制(Multi-Head Attention)
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
二叉树的初步学习
前言 对于二叉树的学习不想其他数据结构一样,直接学习他的结构的构建。单纯的一个二叉树在实际中没什么作用,除非是加了限制条件的,比如大名鼎鼎的红黑树。但是对于初学者而言,刚开始就学习红黑树,会让你刚接触就想放…...
Tkinter菜单和工具栏的设计
在这一章中,我们将深入探讨如何在Tkinter应用程序中设计菜单和工具栏。菜单和工具栏是桌面应用程序中常见的界面元素,它们为用户提供了便捷的操作方式。通过这一章的学习,您将能够在您的Tkinter应用中添加菜单栏和工具栏,提升用户体验。 6.1 菜单栏的设计 菜单栏是应用程…...
windows中搭建Ubuntu子系统
windows中搭建虚拟环境 1.配置2.windows中搭建Ubuntu子系统2.1windows配置2.1.1 确认启用私有化2.1.2 将wsl2设置为默认版本2.1.3 确认开启相关配置2.1.4重启windows以加载更改配置 2.2 搭建Ubuntu子系统2.2.1 下载Ubuntu2.2.2 迁移位置 3.Ubuntu子系统搭建docker环境3.1安装do…...
Docker 部署 Kafka 完整指南
Docker 部署 Kafka 完整指南 本指南将详细介绍如何使用 Docker 部署 Kafka 消息队列系统,包括单节点和集群模式的部署方式。 1. 单节点部署 (Zookeeper Kafka) 1.1 创建 docker-compose.yml 文件 version: 3.8services:zookeeper:image: bitnami/zookeeper:3.8…...
java学习总结(if switch for)
一.基本结构 1.单分支if int num 10; if (num > 5) {System.out.println("num 大于 5"); } 2.双分支if-else int score 60; if (score > 60) {System.out.println("及格"); } else {System.out.println("不及格"); } 3.多分支 int…...
解释:指数加权移动平均(EWMA)
指数加权移动平均(EWMA, Exponential Weighted Moving Average) 是一种常用于时间序列平滑、异常检测、过程控制等领域的统计方法。相比普通移动平均,它对最近的数据赋予更高权重,对旧数据逐渐“淡化”。 ✅ 一、通俗理解 想象你…...
open harmony多模组子系统分析
multimodalinput是open harmony的核心输入子系统,负责统一管理触摸屏,键盘,鼠标,手势,传感器等多种 输入源,提供标准化事件分发机制。其核心 目标是通过统一的事件处理框架,实现跨设备ÿ…...
Hello Java!
1. Java发展史 1.1 计算机编程语言分类 机器语言:电子机器能够直接识别的语言,无需经过翻译,计算机内部就有相应的电路来完成它;从使用的角度来看,机器语言是最低级的语言。 机器语言。指令以二进制代码形式存在。 汇…...
vue 入门:生命周期
文章目录 vue组件的生命周期创建阶段更新阶段销毁阶段生命周期钩子函数 vue组件的生命周期 创建阶段、销毁阶段:只会执行一次更新阶段:会执行多次 创建阶段 beforeCreate 在实例初始化之后,数据观测(data observer)…...
C#容器源码分析 --- Dictionary<TKey,TValue>
Dictionary<TKey, TValue> 是 System.Collections.Generic 命名空间下的高性能键值对集合,其核心实现基于哈希表和链地址法(Separate Chaining)。 .Net4.8 Dictionary<TKey,TValue>源码地址: dictionary…...
yum的基本操作和vim指令
在我们的手机端或者Windows上下载软件,可以在相应的应用商店或者官网进行下载,这样对于用户来说十分的方便和便捷。而在Linux上,也有类似的安装方式,我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…...
MCU刷写——HEX与S19文件互转详解及Python实现
工作之余来写写关于MCU的Bootloader刷写的相关知识,以免忘记。今天就来聊聊Hex与S19这这两种文件互相转化,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走…...
深入探讨避免MQ消息重复消费的策略与实现
引言 随着微服务架构的流行,消息队列(Message Queue, MQ)作为系统间异步通信的重要手段,被广泛应用于各种场景。然而,在使用MQ的过程中,一个不容忽视的问题是消息可能被重复消费。这不仅可能导致数据不一致…...
定制一款国密浏览器(8):SM3 摘要算法
上一章我们讲到了铜锁和 BoringSSL,本章从最简单的国密算法 SM3 摘要算法入手,说明一下 SM3 算法的移植要点。 SM3 算法本身并不复杂,详细算法说明参考《GB∕T 32905-2016信息安全技术 SM3密码杂凑算法》这份文档。因为铜锁开源项目有实现代码,直接照搬过来。 将 crypto/…...
【Docker基础】Compose 使用手册:场景、文件与命令详解
文章目录 一、什么是 Docker Compose二、为什么需要 Docker Compose三、Docker Compose 使用步骤 / 核心功能步骤核心功能: 四、Docker Compose 的使用场景五、Docker Compose 文件(docker-compose.yml)文件语法版本文件基本结构及常见指令常…...
RT-2论文深度解读:视觉-语言-动作统一模型的机器人泛化革命
1. 核心问题与挑战 传统机器人学习存在两大瓶颈: 数据效率低下:依赖特定场景的机器人操作数据(如抓取、推压),收集成本高泛化能力局限:模型仅能完成训练中出现过的任务,无法应对长尾场景 RT-…...
git 提交标签
Git 提交标签 提交消息格式: <type>: <description> (示例:git commit -m "feat: add user login API") 标签适用场景feat新增功能(Feature)。fix修复 Bug(Bug fix&…...
学习率(Learning Rate)
学习率(Learning Rate)是深度学习中最关键的超参数之一,它控制模型在每次参数更新时的“步长大小”。简单来说:它决定了模型从错误中学习的“速度”。 直观比喻 想象你在山顶蒙眼下山(找最低点)࿱…...
李宏毅NLP-3-语音识别part2-LAS
语音识别part2——LAS Listen Listen主要功能是提取内容信息,去除说话人差异和噪声 。编码器(Encoder)结构,输入是声学特征,经过 Encoder 处理后,输出为高级表示,这些高级表示可用于后续语音识别…...
游戏引擎学习第222天
回顾昨天的过场动画工作 我们正在制作一个游戏,目标是通过直播的方式完成整个游戏的开发。在昨天的工作中,我享受了制作过场动画的过程,所以今天我决定继续制作多个层次的过场动画。 昨天我们已经开始了多层次过场动画的基本制作࿰…...
双系统win11 + ubuntu,如何完全卸载ubuntu系统?
双系统win11 ubuntu,如何完全卸载ubuntu? 注意事项 操作前确保有 Windows 安装介质(USB),以防需要修复对 EFI 分区的操作要格外小心如果使用 BitLocker,可能需要先暂停保护如果遇到问题,可以使用 Windows…...
【T2I】Region-Aware Text-to-Image Generation via Hard Binding and Soft Refinement
code: https://github.com/NJU-PCALab/RAG-Diffusion Abstract 区域提示,或组成生成,能够实现细粒度的空间控制,在实际应用中越来越受到关注。然而,以前的方法要么引入了额外的可训练模块,因此只适用于特定…...
HarmonyOS:Map Kit简介
一、概述 Map Kit(地图服务) 为开发者提供强大而便捷的地图能力,助力全球开发者实现个性化显示地图、位置搜索和路径规划等功能,轻松完成地图构建工作。您可以轻松地在HarmonyOS应用/元服务中集成地图相关的功能,全方位…...
【从零实现高并发内存池】- 项目介绍、原理 及 内存池详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
CSS margin(外边距)学习笔记
CSS 中的 margin 属性用于定义元素周围的空白区域,它是一个非常重要的布局工具,可以帮助我们控制元素之间的间距,从而实现更美观和易用的页面布局。以下是对 margin 属性的详细学习笔记。 一、margin 的基本概念 margin 是元素周围的透明区…...
【数据集】中国各省低空经济及无人机相关数据集(1996-2025年2月)
低空经济泛指3000米高空以下的飞行经济活动,以民用客运飞行器和无人驾驶航空器为主。低空经济产业是先进飞行器出行(AAM)在城市低空运行的一种变革性和颠覆性的复合新产业,主要以垂直起降型飞机(VTOL)与无人…...
C++动态分配内存知识点!
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家好呀,又是分享干货的时间,今天我们来学习一下动态分配内存。 文章目录 1.动态分配内存的思想 2.动态分配内存的概念 2.1内存分配函数 2.2动态内存的申请和释放 2.3内存碎片问…...
哈喽打车 小程序 分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 这一次遇到这种风控感觉挺有…...
泛型的二三事
泛型(Generics)是Java语言的一个重要特性,它允许在定义类、接口和方法时使用类型参数(Type Parameters),从而实现类型安全的代码重用。泛型在Java 5中被引入,极大地增强了代码的灵活性和安全性。…...
云计算:数字浪潮中的第三次文明跃迁——从虚拟化到智能协同的范式革命
一、浪潮的序曲:从机械革命到数字原子的觉醒 20世纪中叶,当晶体管的发明点燃信息革命的火种时,人类社会的第三次浪潮已悄然萌芽。托夫勒预言的“信息将成为新的权力核心”,在21世纪初以云计算的形态具象化。这场浪潮的起点&#…...
redis哨兵机制 和集群有什么区别:
主从: 包括一个master节点 和多个slave节点: master节点负责数据的读写,slave节点负责数据的读取,master节点收到数据变更,会同步到slave节点 去实现数据的同步。通过这样一个架构可以去实现redis的一个读写分离。提升…...
java基础2
构造器: 构造器与类同名; 每个类可以有一个以上的构造器; 构造器可以有0个,1个或多个参数; 构造器没有返回值; 构造器总是伴着new一起调用 方法重载: 方法名字一样,参数不一样…...
《算法笔记》3.6小节——入门模拟->字符串处理
1009 说反话 #include <cstdio>int main() {char sen[80][80];int num0;while(scanf("%s",sen[num])!EOF){num;}for (int i num-1; i > 0; --i) {printf("%s ",sen[i]);}printf("%s\n",sen[0]);return 0; }字符串连接 #include <io…...
JavaScript:BOM编程
今天我要介绍的是JS中有关于BOM编程的知识点内容:BOM编程; 介绍:BOM全名(Browser Object Model(浏览器对象模型))。 是浏览器提供的与浏览器窗口交互的接口,其核心对象是 window。与…...
用户自定义函数(UDF)开发与应用(二)
五、UDF 在不同平台的应用 5.1 数据库中的 UDF 应用(如 MySQL、PostgreSQL) 在数据库领域,UDF 为开发者提供了强大的扩展能力,使得数据库可以完成一些原本内置函数无法实现的复杂操作。 以 MySQL 为例,假设我们有一…...
C++——继承、权限对继承的影响
目录 继承基本概念 编程示例 1.基类(父类)Person 代码特点说明 权限对类的影响 编辑 编程示例 1. 公有继承 (public inheritance) 2. 保护继承 (protected inheritance) 3. 私有继承 (private inheritance) 重要规则 实际应用 继承基本概…...