当前位置: 首页 > news >正文

c、c++排序的相关知识(归并排序、计数排序、稳定性等)

排序,是对给定的一组数,按照某种逻辑关系,进行位置上的移动。由于排序至少需要将所有数过一遍(正常情况下,非特殊数组),因此排序的时间复杂度一定不能小于O(N)。

归并排序:通过将一个大数据组分割成一个个小数据组,对小数据组排序,排好序后再整体排序。

时间复杂度为O(NlogN),空间复杂度为O(N),其算法最好、最坏情况下时间复杂度均为O(NlogN),是一种十分高效的排序算法,本质上是一种以空间换时间的算法。

void _merge(int* a, int* tmp, int left1, int right1, int left2, int right2)
{    int left = left1;int right = right2;int cur = left1;while (left1 <= right1 && left2 <= right2){if (a[left1] < a[left2]){tmp[cur++] = a[left1++];}else{tmp[cur++] = a[left2++];}}while (left1 <= right1){tmp[cur++] = a[left1++];}while (left2 <= right2){tmp[cur++] = a[left2++];}while (left<= right){a[left] = tmp[left];left++;}}void merge(int* a, int* tmp, int left, int right)
{if (left >= right){return;}int mid=(left+right)/2;merge(a, tmp, left, mid);merge(a, tmp, mid + 1, right);_merge(a, tmp, left,mid,mid+1, right);}// 归并排序递归实现
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc");exit(-1);}merge(a, tmp, 0, n-1);free(tmp);}// 归并排序非递归实现
void MergeSortNonR(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc");exit(-1);}int gap = 1;while (gap < n){for (int i = 0; i < n; i += 2*gap){int left1 = i;int right1 = i + gap - 1;int left2 = i + gap;int right2 = i + 2 * gap - 1;if (right1 >= n-1){break;}if (right2 >= n){right2 = n - 1;}_merge(a, tmp, left1, right1, left2, right2);}gap *= 2;}free(tmp);
}

对于递归的算法,就是单纯的不断分割直到只有一个数无法再分割,然后在往回不断归并,结构上类似二叉树的后序遍历。

对于非递归的算法,由于其在逻辑上需要不断进行归并、不断扩大每次归并的数据个数,因此很难通过栈的方式模拟实现,而是选择了用gap当做当前每次归并时一组数的个数,而这里最需要注意的就是数组越界问题,即除了begin1之外的数都有可能会越界,因此需要判断。当begin2>=n的时候,即第二个数不存在,因此不需要归并。当end2>=n的时候,即第二个存在,但大小无法到gap个,此时缩小end2的大小,使得第二组的数据个数为end2-begin2+1个,再与第一组数进行归并。

稳定性:

所谓稳定性,就是指原本相同的数据的相对位置关系,在排序后不发生变化。

常见的排序有冒泡排序、直接插入排序、希尔排序、堆排序、快速排序、归并排序、选择排序。

其中稳定的有冒泡排序、直接插入排序、归并排序

不稳定:

1.希尔排序:原因是在预排序的时候可能同样的数据在不同的组进行排序,导致相对位置变化

2.堆排序:原因是堆排序时要把根节点的元素与最后一个元素互换,导致数据之间的相对位置变化。

3:选择排序:原因是找到最大、最小的元素,将当前最左、最右测的元素与其互换的时候可能会使得位置发生改变。

4:快速排序:每次将最左侧的元素放到最终位置时,可能会导致相对位置改变。

相关文章:

c、c++排序的相关知识(归并排序、计数排序、稳定性等)

排序&#xff0c;是对给定的一组数&#xff0c;按照某种逻辑关系&#xff0c;进行位置上的移动。由于排序至少需要将所有数过一遍&#xff08;正常情况下&#xff0c;非特殊数组&#xff09;&#xff0c;因此排序的时间复杂度一定不能小于O&#xff08;N&#xff09;。 归并排…...

oracle定时任务的使用

常见错误&#xff1a; PLS-00225: subprogram or cursor xxx reference is out of scope # job名字太长PLS-00201: identifier COUNT_JOB.SUBMIT must be declared # DBMS_JOB.SUBMIT是固定写法创建存储过程 -- 建表 CREATE TABLE TEST_A(TEST_ADD_DATA DATE); -- 存储过程 C…...

VSCode 配置 Lua 开发环境(清晰明了)

概述 由于 AutoJS 学得已经差不多了&#xff0c;基本都会了&#xff0c;现在开始向其他游戏脚本框架进发&#xff0c; Lua 语言很强大&#xff0c;就不多说&#xff0c; 按键精灵、触动精灵等等都是用该语言编程脚本的&#xff0c;由于按键精灵、触动精灵 和 AutoJS 类似,不是…...

JS合并2个远程pdf

要在HTML和JavaScript中读取远程PDF文件的矢量数据并合并两个PDF文件&#xff0c;您可以使用pdf-lib和Axios库。以下是使用pdf-lib和Axios在HTML和JavaScript中读取和合并远程PDF文件的步骤&#xff1a; 1. 引入 首先&#xff0c;确保您在HTML文件中引入了pdf-lib和Axios库。…...

TikTok的伦理挑战:虚拟世界与现实世界的交汇

在数字时代&#xff0c;社交媒体平台已经不再只是一个信息传播的工具&#xff0c;它已经深刻地改变了我们的社交行为、价值观和伦理观。 而在这一领域的佼佼者之一&#xff0c;TikTok&#xff0c;正面临着伦理挑战&#xff0c;这是虚拟世界与现实世界交汇的产物。 本文将深入…...

C# 获取磁盘空间大小的方法

方法一&#xff1a;利用System.IO.DriveInfo.GetDrives方法来获取 /// 获取指定驱动器的空间总大小(单位为B)////// 只需输入代表驱动器的字母即可 &#xff08;大写&#xff09;///public static long GetHardDiskSpace(string str_HardDiskName){long totalSize new long();…...

JVM机制理解与调优方案

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言 很多Java开发…...

Django的设计模式及模板层

Django的设计模式及模板层 设计模式MVC和MVT MVC 代表 Model-View-Controller(模型-视图-控制器)模式。 M 模型层(Model),主要用于对数据库层的封装 V 视图层(View),用于向用户展示结果 (WHAT HOW) C 控制(Controller&#xff0c;用于处理请求、获取数据、返回结果(重要) 作…...

写代码生成流程图

我们在写文档&#xff0c;博客的时候&#xff0c;一般都会使用markdown语法&#xff0c;最常见的就是一些github开源项目的README。有时候会去画一些流程图&#xff0c;例如使用process.on或者xmind等第三方网站&#xff0c;然后截图插入到文档中。 今天我们介绍一种使用代码直…...

python reportlab生成pdf

这里自定义了pagetemplate&#xff0c;使用BaseDocTemplate&#xff0c;但我感觉一般使用SimpleDocTemplate就可以。 from reportlab.platypus import Frame from reportlab.lib.pagesizes import A4, landscapepadding dict(leftPadding72,rightPadding72,topPadding72,bott…...

第一次作业题解

第一次作业题解 P5717 【深基3.习8】三角形分类 思路 考的是if()的使用,还要给三条边判断大小 判断优先级&#xff1a; 三角形&#xff1f;直角、钝角、锐角等腰等边 判断按题给顺序来 代码 #include <stdio.h> int main() {int a 0, b 0, c 0, x 0, y 0, z 0…...

美篇作文网教学资源源码-自带作文数据

非常漂亮的UI设计和页面排版&#xff01; 自适应手机pc端 页面内容均支持自定义 可以用来做网站矩阵&#xff0c;或者增强你其他网站板块&#xff0c;或者单独运营都可以。 可以通过广告方式变现&#xff0c;或者引流等等 友好的seo&#xff0c;更容易被浏览器收录 关注青狐…...

电脑软件:Duplicate Cleaner Pro 5.16 重复文件清理软件(附下载)

大家平时在使用电脑的时候&#xff0c;会经常从网上下载文件或者从其他电脑拷贝文件到自己的电脑上。久而久之就会在电脑中存放很多相同的文件&#xff0c;并且会越积越多&#xff0c;不仅占用很多磁盘空间&#xff0c;在文件管理上也非常混乱不方便。如何解决呢&#xff1f; …...

支持笔记本电脑直插直充,TOWE 65W智能快充PDU超级插座

电源插排在我们的生活中是必不可少的电器配件。今天&#xff0c;我们日常生活中所使用的电子设备越来越多&#xff0c;无论是手机、平板、笔记本电脑还是各种家用电器&#xff0c;都需要电源来驱动。虽然相对于其他电器来说&#xff0c;插排结构比较简单&#xff0c;但现代家庭…...

部署Kafka

kafka&#xff1a;kafka_2.13-3.5.1 NOTE: Your local environment must have Java 8 installed. Apache Kafka can be started using ZooKeeper or KRaft. To get started with either configuration follow one the sections below but not both. 1 Windows单机 1.1 Kafka w…...

Open3D 进阶(11)使用GMM-Tree算法对点云配准

GMM-Tree算法 一、算法原理1、主要函数2、参考文献二、代码实现三、结果展示1、点云初始位置2、配准后的位置四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、...

算法刷题注意事项

目录 1、使用nextInt后再使用nextLine的注意事项2、判断x是否是素数3、注意字符串和数字的排序4、Arrays.asList不可修改元素 1、使用nextInt后再使用nextLine的注意事项 使用nextInt再使用nextLine会有问题&#xff0c;输入的回车会被nextLine给接受&#xff0c;可以将nextLi…...

搭建自己的pypi服务器

要搭建自己的 PyPI 服务器&#xff0c;您可以使用 warehouse 项目&#xff0c;它是 PyPI 的开源实现。下面是一些基本步骤&#xff1a; 准备环境&#xff1a; 安装 Python安装 PostgreSQL 数据库 克隆 warehouse 项目&#xff1a; git clone https://github.com/pypa/wareh…...

ndoe.js、npm相关笔记

1、npm 全局安装 npm config get prefix 获取 npm 全局安装路径如果全局插件不能正常使用&#xff0c;看环境变量是否已经配置。没有配置则把全局安装路径配置到环境变量的path中...

如何使用ArcGIS Pro制作标准地图样式国界

相信大家都浏览过标准地图服务提供的标准地图&#xff0c;不知道你有没有想过尝试制作里面的国界&#xff0c;这里为大家介绍一下制作方法&#xff0c;希望能对你有所帮助。 制作已定国界 在地图数据内&#xff0c;国界分为已定国界、未定国界和海岸线&#xff0c;我们先对已定…...

告别数据焦虑:WeChatExporter如何重塑你的数字记忆管理体验

告别数据焦虑&#xff1a;WeChatExporter如何重塑你的数字记忆管理体验 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 当你深夜翻看三年前的聊天记录&#xff0c;却发现…...

MCP Analytics Suite:用自然语言驱动AI数据分析,零代码生成专业报告

1. 项目概述&#xff1a;当AI助手遇上专业数据分析如果你和我一样&#xff0c;日常工作中需要处理大量的业务数据——可能是Shopify的订单报表、Stripe的支付流水&#xff0c;或者是一堆从各个渠道导出的CSV文件——那你一定体会过那种“数据在手&#xff0c;却无从下手”的焦虑…...

SRWE:Windows窗口实时编辑器的专业应用指南

SRWE&#xff1a;Windows窗口实时编辑器的专业应用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 在数字内容创作和游戏开发领域&#xff0c;分辨率限制常常成为技术瓶颈。传统Windows窗口管理系统缺乏灵活…...

运营商网络工程师视角:VoWiFi部署中的ePDG与AAA服务器配置要点及避坑指南

运营商网络工程师实战&#xff1a;VoWiFi部署中ePDG与AAA服务器配置的20个关键细节 当运营商开始规划VoWiFi网络时&#xff0c;会议室的白板上总是画满了各种接口和协议栈。但真正决定项目成败的&#xff0c;往往是那些容易被忽略的配置细节——比如IKEv2协商时DH组的选择会怎样…...

ARM PMU性能监控架构与寄存器详解

1. ARM PMU性能监控架构概述 性能监控单元(Performance Monitoring Unit, PMU)是现代处理器中用于硬件级性能分析的关键模块。作为ARM架构的重要组成部分&#xff0c;PMU通过一组可编程计数器来记录处理器运行过程中发生的各类微架构事件&#xff0c;为系统性能分析和优化提供数…...

MSP 盈利、留客、提口碑,核心就盯这12个 KPI

很多 MSP&#xff08;托管服务提供商&#xff09;都会陷入一个误区&#xff0c;手里握着一堆散落在各个看板的运营数据&#xff0c;却始终搞不清哪些指标能真正帮自己提升服务质量、拉高利润、留住客户。忙忙碌碌做了一堆报表&#xff0c;最终还是凭感觉做决策&#xff0c;业务…...

不止于Java:在Termux的Ubuntu子系统里,我这样配置Python/Node.js多语言开发环境

不止于Java&#xff1a;在Termux的Ubuntu子系统里配置Python/Node.js多语言开发环境 将手机变成便携式开发工作站早已不是天方夜谭。通过Termux和proot-distro搭建的Ubuntu子系统&#xff0c;开发者可以在Android设备上构建完整的Linux开发环境。与局限于单一语言的解决方案不同…...

WordPress集成Claude AI:构建智能内容创作技术栈的实践指南

1. 项目概述与核心价值最近在折腾个人博客和内容创作工具链&#xff0c;发现了一个挺有意思的GitHub项目&#xff1a;mvtandas/wordpress-claude-stack。这名字一看就很有料&#xff0c;直接把WordPress和Claude这两个看似不搭界的玩意儿给“堆”到了一起。作为一个常年混迹在内…...

FPGA仿真库配置避坑指南:Xilinx 7系、Altera Cyclone V、Lattice ECP5在ModelSim 10.6d下的完整流程

FPGA仿真库配置避坑指南&#xff1a;Xilinx 7系、Altera Cyclone V、Lattice ECP5在ModelSim 10.6d下的完整流程 第一次在ModelSim 10.6d环境下配置FPGA仿真库时&#xff0c;我花了整整三天时间排查各种路径错误和权限问题。直到现在&#xff0c;我还清楚地记得那个深夜——当仿…...

TigerVNC终极指南:快速掌握跨平台远程桌面控制

TigerVNC终极指南&#xff1a;快速掌握跨平台远程桌面控制 【免费下载链接】tigervnc High performance, multi-platform VNC client and server 项目地址: https://gitcode.com/gh_mirrors/ti/tigervnc TigerVNC是一款高性能、跨平台的VNC客户端和服务器软件&#xff0…...