C++排序算法

  • 一、概览
  • 二、代码实现
    • 1.冒泡排序
    • 2.插入排序
    • 3.希尔排序
    • 4.堆排序
    • 5.选择排序
    • 6.快速排序
    • 7.归并排序
  • 三、排序时间、空间复杂度总结

排序,是C++各大算法当中非常常见的一个步骤(过程),通常我们使用便捷的algorithmalgorithmalgorithm头文件下的sortsortsort排序。不过,随着排序的时间复杂度在题目算法中的重要性日益增强,很多排序甚至自成一种算法,别的算法需调用这个算法,而有的排序仅仅是简单的工具。不过,现在我们称每种排序均为“排序算法”。

一、概览

下面常见几种排序的概览
在这里插入图片描述

二、代码实现

接下来,我将展示这几种算法的实现方法(代码)

1.冒泡排序

普通版:普通版:普通版:

void BubbleSort(int* a, int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) {if (a[j] > a[j + 1]) {swap(a[j], a[j + 1]);}}}
}

加强版:加强版:加强版:

void BubbleSort(int* a, int n) {for (int i = 0; i < n - 1; i++) {int flag = 1;for (int j = 0; j < n - 1 - i; j++) {if (a[j] > a[j + 1]) {flag = 0;swap(a[j], a[j + 1]);}}if (flag) {break;}}
}

2.插入排序

void Insert(int* a, int n)
{for (int i = 0; i < n - 1; i++) {int j = 0;int tmp = a[i + 1];for (j = i; j >= 0 && tmp < a[j]; j--) {a[j + 1] = a[j];}a[j + 1] = tmp;}
}

3.希尔排序

希尔排序其实是插入排序的进化版

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;}}
}

4.堆排序

void AdjustDown(int*a,int root,int n) {int parent = root;int child = 2 * parent + 1;//向下调整算法while (child < n) {if (child+1<n&&a[child] < a[child + 1]) {++child;}if (a[child] > a[parent]) {swap(a[child], a[parent]);parent = child;child = 2 * parent + 1;}else {break;}}
}void  HeapSort(int* a, int n) {for (int i = (n - 2) / 2; i >= 0; i--) {AdjustDown(a, i, n);       }int end = n - 1;while (end>0) {swap(a[0], a[end]);AdjustDown(a, 0, end);end--;}}

5.选择排序

void SelectSort(int* a, int n) {int left = 0;int right = n - 1;int minIndex = left, maxIndex = left;while (left < right) {for (int i = left; i <= right; i++) {if (a[i] < a[minIndex]) {minIndex = i;}if (a[i] > a[maxIndex]) {maxIndex = i;}}swap(a[left], a[minIndex]);if (left == maxIndex) {maxIndex = minIndex;}swap(a[right], a[maxIndex]);left++;right--;}
}

6.快速排序

 int GetMindIndex(int* a, int left, int right) {//三数取中int mid = (left + right) >> 1;if (a[left] < a[mid]) {if (a[mid] < a[right]) {return mid;}else if (a[left] > a[right]) {return left;}else {return right;}}else {if (a[mid] > a[right]) {return mid;}else if (a[left] < a[right]) {return left;}else {return right;}}
}int partition2(int* a, int left, int right) {//给你挖个坑你就往里跳法int mid = GetMindIndex(a, left, right);int key = a[left];swap(key, a[mid]);while (left < right) {while (left < right && a[right] >= key) {--right;}a[left] = a[right];while (left < right && a[left] <= key) {++left;}a[right] = a[left];}a[left] = key;return left;
}void QuickSort(int* a, int left, int right) {//正常的快速排序if (left >= right)return;int mid = partition2(a, left, right);QuickSort(a, left, mid - 1);QuickSort(a, mid + 1, right);}

7.归并排序

 
void _MerageSort(int* a, int* tmp , int left, int right) {if (left >= right)return;int mid = (left + right) >> 1;_MerageSort(a,tmp, left, mid);_MerageSort(a,tmp, mid + 1, right);int begin1 = left;int end1 = mid;int begin2 = mid + 1;int end2 = right;int index = left;while (begin1 <= end1 && begin2 <= end2) {if (a[begin1] < a[begin2]) {tmp[index++] = a[begin1++];}else {tmp[index++] = a[begin2++];}}while (begin1<=end1){tmp[index++] = a[begin1++];}while (begin2 <= end2) {tmp[index++] = a[begin2++];}for (int i = left; i <= right; i++) {a[i] = tmp[i];}}
void MerageSort(int* a, int n) {int* tmp = new int[n];_MerageSort(a, tmp, 0, n - 1);
delete[] tmp;}

三、排序时间、空间复杂度总结

在这里插入图片描述声明:本图片非自行制作,参考其他博主。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天五分钟深度学习:深层神经网络的优势

本文重点 在人工智能领域,深层神经网络(DNN)的崛起标志着技术范式的根本性转变。相较于传统浅层神经网络(如单层感知机、线性回归模型),深层网络通过引入多层隐藏层,实现了对复杂数据模式的深度解析与高效建模。 深层神经网络 神经网络中输入层表示神经网络的第0层,…

相机几何 空间点到像素平面转换

一个空间中点到像素平面转换&#xff0c;需要经过1. 空间坐标系转换到相机坐标系2. 相机坐标系下3D点到相机平面转换3. 相机平面到像素平面转换相机三维空间到像素平面转换1. 3D点到相机平面转换2. 相机平面到像素平面转换涉及到单位的转换&#xff0c;和像素原点到相机平面原点…

webpack5 vue3同一仓库,不同命令切换项目

技术方案&#xff1a;手动输入不同的命令&#xff0c;启动不同项目。实现这种能力本篇文章是通过不同路由划分&#xff0c;进而实现不同项目的划分。所以简单来说就是通过输入不同命令行在webpack中找到不同项目的路由&#xff0c;进而打不同项目的包&#xff0c;实现项目隔离。…

PowerBI实战-制作带有同比及趋势线的双柱状图

一、引言 今天的PowerBI报表的制作相对有一点复杂&#xff0c;我们直接根据最终展示图来讲解&#xff1a; 可以看到&#xff0c;我们今天要制作的图像需要包括以下几点&#xff1a;时间维度的趋势、两种不同维度的数据对比、不同数据标签的展示、不同年份间环比的标签展示以及…

物联网智能网关配置教程:实现注塑机数据经基恩士PLC上传至云平台

一、项目背景随着制造业向智能化、信息化方向快速发展&#xff0c;注塑车间作为塑料制品制造的核心环节&#xff0c;面临着设备协议多样、数据孤岛严重、系统集成困难等问题。某大型注塑企业计划对其老旧车间进行数字化改造&#xff0c;实现设备数据采集、远程监控与MES系统对接…

【实战】预警算法--噪声添加机制

1. 背景 在多变量自联想预测或异常检测场景中&#xff0c;我们常使用带噪自编码器&#xff08;Denoising AutoEncoder&#xff0c;DAE&#xff09;来训练模型&#xff0c;使模型能够从带噪输入中重构原始数据。噪声的添加方式对训练效果、稳定性以及模型用途有显著影响。 2. 两…

ChromaDB探索

关于 ChromaDB、向量与 RAG 系统的核心知识问答总结 ​​Q1: ChromaDB 是什么&#xff1f;它在数据库领域中扮演什么角色&#xff1f;​​​​A:​​ ChromaDB 是一款开源的​​向量数据库​​。它的核心角色是专门为 AI 应用&#xff08;如语义搜索、推荐系统、RAG&#xff09…

C# 基于halcon的视觉工作流-章33-矩状测量

C# 基于halcon的视觉工作流-章33-矩状测量 本章目标&#xff1a; 一、gen_measure_rectangle2准备提取垂直于矩形的直边&#xff1b; 二、measure_pos 提取垂直于矩形或环形弧的直线边缘&#xff1b; 三、measure_pairs提取垂直于矩形或环形弧长轴的直边对&#xff1b; 四、匹配…

Day05_苍穹外卖——Redis店铺营业状态设置

目录1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具2. Redis数据类型2.1 五种常用数据类型介绍2.2 各种数据类型特点3. Redis常用命令3.1 字…

双指针:字符串

题目&#xff1a;字符串 题目概述&#xff1a;找包含所有小写字母的最短字符串。 重点思路&#xff1a; right是 < len-1字符 - ‘26’转换成整形再判断&#xff08;写字符a也可以&#xff0c;更准确&#xff09;。 #include <iostream> #include <algorithm>…

HarmonyOS 应用开发深度实践:精通 Stage 模型与 UIAbility 生命周期

好的&#xff0c;请看这篇关于 HarmonyOS Stage 模型与 UIAbility 深度实践的技术文章。 HarmonyOS 应用开发深度实践&#xff1a;精通 Stage 模型与 UIAbility 生命周期 引言 随着 HarmonyOS 4、5 的广泛部署和 HarmonyOS NEXT (API 12) 的发布&#xff0c;华为的分布式操作系…

DEDECMS 小程序插件简介 2.0全新上线

网上有很多的dedecms的小程序插件&#xff0c;但是有的依赖他们第三方、有的需要一定php或sql基础、有的插件免费但是小程序源码价格昂贵&#xff0c;这也是促使我开发dedecms小程序插件的一大原因。2025年9月4日 dedecms小程序插件2.0版本正式上线&#xff0c;由于使用人数减少…

Flink 1.17.2 集群安装部署

Flink集群的安装 1. 集群规划 Ip host Server Note 192.168.10.101 node01 jobManager、TaskManagerRunner 老大和小弟服务 192.168.10.102 node02 TaskManagerRunner 小弟 192.168.10.103 node03 TaskManagerRunner 小弟 注意&#xff1a;本次使用jdk-1.8.0…

[vue.js] 树形结点多选框选择

vue.js前端代码&#xff1a; <template><div><el-tree:data"treeData"node-key"id"show-checkboxref"tree"check-change"handleCheckChange"/><el-button click"getSelectedNodes">获取选中的节点&…

Web 服务器基本工作流程

这是一个关于 ​​Web 服务器基本工作流程​​ 的全面解释。我们以最经典的 ​​客户端-服务器-后端​​ 三层架构为例&#xff0c;并结合你之前遇到的 Nginx 场景进行说明。​​核心角色​​​​客户端 (Client)​​&#xff1a; 通常是 ​​Web 浏览器​​ (Chrome, Firefox)…

IDEA 连接MySQL数据库

一、 连接数据库1、打开连接2、建立连接3、输入用户名和密码二、操作数据库1、选择数据库2、New| Query Console 查询控制台3、写查询语句4、New| SQL Script| sql Generator 生成这个数据库表的SQL结构New | SQL Script | Generate DDL to Query Console 在查询控制台生成…

江协科技STM32课程笔记(二)—外部中断EXTI

二、外部中断EXTI中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行。1、stm32中断简介…

Java常见排序算法实现

以下是Java中几种常见排序算法的实现&#xff0c;包括冒泡排序、选择排序、插入排序、快速排序和归并排序。 各排序算法特点说明&#xff1a;冒泡排序&#xff1a; 原理&#xff1a;重复比较相邻元素&#xff0c;将大的元素逐步"冒泡"到数组末尾特点&#xff1a;稳定…

Python爬虫实战:研究Pandas,构建地理信息数据采集和分析系统

1. 引言 1.1 研究背景 地理数据作为描述地球表面空间要素的数据,包含了丰富的空间位置、分布特征和属性信息,在城市规划、环境监测、商业分析等众多领域发挥着不可替代的作用。随着 "数字地球"、"智慧城市" 等概念的提出和发展,地理数据的重要性日益凸…

nvm安装node后出现报错: “npm 不是内部或外部命令,也不是可运行的程序 或批处理文件”

一、问题描述 使用nvm安装node后&#xff0c;使用npm命令报错如下 报错1&#xff1a;npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。报错2&#xf…