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

C++排序算法

排序算法复习

冒泡排序

链接:https://www.runoob.com/w3cnote/bubble-sort.html
每次循环对比【相邻】两个元素,将最大的元素放到数组最后

void bubbleSort(int* arr, int n){//每次确认一个元素的最终位置,循环n-1次即可确认全部元素的最终位置//外层只是用来控制循环次数,并没有参与比较for(int i = 0; i < n - 1; i++){//每次确认的元素都会被放在数组最后,所以要循环遍历前面的元素//循环i次时确认了i+1个元素的位置,还剩下n-(i+1)个元素的位置待确认,所以内部循环n-i-1次for(int j = 0; j < n - i - 1; j++){if(arr[j] > arr[j + 1]){ //升序排序,所以用大于号swap(arr[j], arr[j + 1]);}}}
}

选择排序

链接:https://www.runoob.com/w3cnote/selection-sort.html
每次循环对比i和j位置的元素(不一定相邻),不断交换i和j位置的元素,将最小的元素放在最前面

void selectionSort(int* arr, int n){//每次循环确认一个元素的最终位置//升序排序:每次将未确定最终位置的元素中最小的放在最前面for(int i = 0; i < n - 1; i++){//内层循环寻找小于当前i位置元素的最小值for(int j = i + 1; j < n; j++){if(arr[i] > arr[j]){swap(arr[i], arr[j]);}}}
}

插入排序

链接:https://www.runoob.com/w3cnote/insertion-sort.html
每次循环就是将第i+1个元素插入到已经排好序的i个元素中;
对几乎已经排好序的序列进行排列时比较高效。

void insertionSort(int* arr, int n){for(int i = 1; i < n; i++){int tmp = arr[i]; //arr[i]是需要单独记录的,因为随着插入排序的进行,原来i位置的元素会改变int j;for(j = i; j > 0; j--){if(arr[j - 1] > tmp) arr[j] = arr[j - 1];else{break;}}arr[j] = tmp;}
}

希尔排序 / 缩小增量排序

链接:https://www.runoob.com/w3cnote/shell-sort.html
插入排序的升级版,先将整个待排序的序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再依次对全体数据进行直接插入排序

void shellSort(int* arr, int n){int h = 1; //增量while(h < n / 3){h = h * 3 + 1;}while(h >= 1){//外层只是用来控制循环次数,没有参与比较for(int i = h; i < n; i++){for(int j = i; j >= h; j -= h){if(arr[j] < arr[j - h]){swap(arr[j], arr[j - h]);}}}h /= 3; //缩小增量}
}

归并排序

链接:https://blog.csdn.net/yang_yi520/article/details/125001902
分治思想,先解决小问题,再解决大问题

void merge(int* arr, int left, int mid, int right, int* temp){int i = left;int j = mid + 1;int cur = 0;while(i <= mid && j <= right){if(arr[i] < arr[j]){temp[cur++] = arr[i++];}else{temp[cur++] = arr[j++];}}while(i <= mid){temp[cur++] = arr[i++];}while(j <= right){temp[cur++] = arr[j++];}int n = right - left + 1;for(int i = 0; i < n; i++){arr[left + i] = temp[i];}
}void mergeSort(int* arr, int left, int right, int* temp){if(left < right){int mid = left + ((right - left) >> 1);mergeSort(arr, left, mid, temp); //先排 left-mid 位置的元素mergeSort(arr, mid + 1, right, temp); //再排 mid+1-right 位置的元素merge(arr, left, mid, right, temp); //将排好序的两边归并}
}

快速排序

链接:https://blog.csdn.net/weixin_45031801/article/details/126962679
分治,先解决大问题,再解决小问题

int part(int* arr, int left, int right){int pivot = arr[left];int i = left;int j = right;while(i < j){while(i < j && arr[j] > pivot){j--;}if(i < j) swap(arr[i++], arr[j]);while(i < j && arr[i] < pivot){i++;}if(i < j) swap(arr[i], arr[j--]);}return i;
}void quickSort(int* arr, int left, int right){if(left < right){int mid = part(arr, left, right);quickSort(arr, left, mid - 1); //mid-1quickSort(arr, mid + 1, right); //mid+1}
}

堆排序

视频教程

//堆是一个完全二叉树//n: 堆中元素数量
//i: 要维护的元素
void heapify(int* arr, int n, int i) {int largest = i; //先假定当前父子节点三个元素中最大值在父节点所在位置int lson = i * 2 + 1; //左孩子下标int rson = i * 2 + 2; //右孩子下标//要记得判断孩子下标是否超出范围if (lson < n && arr[largest] < arr[lson])largest = lson;if (rson < n && arr[largest] < arr[rson])largest = rson;if (largest != i) {swap(arr[largest], arr[i]);heapify(arr, n, largest); //交换完元素后要继续维持堆的秩序}
}void heapSort(int* arr, int n) {//建堆//n/2-1 是堆中最后一个拥有子节点的父节点的下标for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}//排序for (int i = n - 1; i > 0; i--) {swap(arr[i], arr[0]); //将堆中最大的元素放到最后heapify(arr, i, 0); //确定最大元素的位置后,剩余i个元素,从位置0开始维持堆的秩序}
}

计数排序

视频教程

//计数排序只能用于正数排序
void countSort(int* arr, int n) {//找到最大值以构造累计数组int max = 0;for (int i = 0; i < n; i++) {max = max > arr[i] ? max : arr[i];}//构造累计数组vector<int> count(max + 1, 0); //计数数组for (int i = 0; i < n; i++) {count[arr[i]]++;}//将计数数组转为累计数组for (int i = 1; i < count.size(); i++) {count[i] += count[i - 1];}//计算最终排序vector<int> temp(n, 0);for (int i = 0; i < n; i++) {int index = count[arr[i]] - 1;temp[index] = arr[i];count[arr[i]]--;}for (int i = 0; i < n; i++) {arr[i] = temp[i];}
}

桶排序

链接:https://zhuanlan.zhihu.com/p/164992268

void bucketSort(int* arr, int n) {vector<vector<int>> bucket(5, vector<int>());for (int i = 0; i < n; i++) {bucket[arr[i] / 5].push_back(arr[i]);}for (int i = 0; i < 5; i++) {sort(bucket[i].begin(), bucket[i].end());}int cur = 0;for (int i = 0; i < 5; i++) {for (int j = 0; j < bucket[i].size(); j++) {arr[cur++] = bucket[i][j];}}
}

基数排序

视频教程

void radixSort(int* arr, int n, int digit) {vector<int> record(n);vector<int> count(10);for (int i = 0; i < digit; i++) {int division = pow(10, i);for (int j = 0; j < n; j++) {int num = arr[j] / division % 10;count[num]++;}for (int j = 1; j < 10; j++) {count[j] += count[j - 1];}for (int j = n - 1; j >= 0; j--) {int num = arr[j] / division % 10;record[--count[num]] = arr[j];}for (int j = 0; j < n; j++) {arr[j] = record[j];}count.assign(10, 0);}
}int main() {int arr[10] = { 223, 124, 90, 8, 1128, 67, 980, 123, 90, 78 };int digit = 0;//确定变量中最大位数for (int i = 0; i < 10; i++) {int count = 0;int tmp = arr[i];while (tmp) {tmp /= 10;count++;}digit = digit > count ? digit : count;}radixSort(arr, 10, digit);for (int i = 0; i < 10; i++) {cout << arr[i] << " ";}cout << endl;
}

相关文章:

C++排序算法

排序算法复习 冒泡排序 链接&#xff1a;https://www.runoob.com/w3cnote/bubble-sort.html 每次循环对比【相邻】两个元素&#xff0c;将最大的元素放到数组最后 void bubbleSort(int* arr, int n){//每次确认一个元素的最终位置&#xff0c;循环n-1次即可确认全部元素的最…...

JAVA后端部署项目三步走

1. JAVA部署项目三步走 1.1 查看 运行的端口 lsof -i:8804 &#xff08;8804 为端口&#xff09; 发现端口25111被监听 1.2 杀死进程,终止程序 pid 为进程号 kill -9 pid 1.3 后台运行jar包 nohup java -jar -Xms128M -Xmx256M -XX:MetaspaceSize128M -XX:MaxM…...

php使用zookeeper实现分布式锁

介绍 一、zookeeper和redis实现分布式锁的对比 1、redis 分布式场景应用比较广泛&#xff0c;redis分布式锁&#xff0c;其实需要自己不断去尝试获取锁&#xff0c;比较消耗性能&#xff1b;zk分布式锁&#xff0c;获取不到锁&#xff0c;注册个监听器即可&#xff0c;不需要不…...

力扣-可回收且低脂的产品

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道超级超级超级简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1757. 可回收且低脂的产品二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交S…...

代码随想录刷题-数组-二分查找

文章目录写在前面原理习题题目1思路和代码题目-2写在前面 这个专栏是记录我刷代码随想录过程中的随想和总结。每一小节都是根据自己的理解撰写的&#xff0c;文章比较短&#xff0c;主要是为了记录和督促自己。刷完一章后&#xff0c;我会再单独整理一篇文章来总结和分享。 本…...

HCIA复习1

HCIA复习 抽象语言---->编码 编码---->二进制 二进制--->电信号 处理电信号 OSI参考模型----OSI/RM 应用层 表示层 会话层 传输层 端口号&#xff1a;0-65535&#xff1b;1-1023是注明端口 网络层 IP地址 数据链路层 物理层 ARP协议 正向ARP---通过IP地址获取目的MAC地…...

Kotlin中的destructuring解构声明

开发中有时只是想分解一个包含多个字段的对象来初始化几个单独的变量。要实现这一点&#xff0c;可以使用Kotlin的解构声明。本文主要了解&#xff1a;“1、如何使用解构声明这种特性 2、底层是如何实现的 3、如何在你自己的类中实现它1、解构声明的使用解构声明&a…...

Kubernetes Pod 水平自动伸缩(HPA)

Pod 自动扩缩容 之前提到过通过手工执行kubectl scale命令和在Dashboard上操作可以实现Pod的扩缩容&#xff0c;但是这样毕竟需要每次去手工操作一次&#xff0c;而且指不定什么时候业务请求量就很大了&#xff0c;所以如果不能做到自动化的去扩缩容的话&#xff0c;这也是一个…...

钉钉、企业微信和飞书向“钱”看

在急剧变革的时候&#xff0c;不管黑猫白猫&#xff0c;要抓到老鼠才算好猫。如今&#xff0c;各互联网企业早已进入降本增效的新阶段。勒紧裤腰带过日子之下&#xff0c;能不能盈利、商业化空间有多大&#xff0c;就成为各个业务极为重要的考核指标。在各业务板块中&#xff0…...

网上购物网站的设计

技术&#xff1a;Java、JSP等摘要&#xff1a;本文介绍了JSP和JAVA等相关技术&#xff0c;针对网上购物系统的实际需求&#xff0c;设计开发了一个基于JSP的小型电子商务网站也就是网上购物系统&#xff0c;。在设计开发中&#xff0c;采用的是SSH框架&#xff08;strutsspring…...

【Java学习笔记】8.Java 运算符

Java 运算符 计算机的最基本用途之一就是执行数学运算&#xff0c;作为一门计算机语言&#xff0c;Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组&#xff1a; 算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 算术运算符 算术运算符…...

RHCSA-使用命令管理文件(3.6)

硬链接与软链接基本操作&#xff1a; 创建软硬连接的命令&#xff1a;ln 硬链接&#xff1a;ln 源文件&#xff08;已经存在的文件&#xff09; 链接文件名&#xff08;新建&#xff09; 软连接&#xff1a;ln -s 源文件&#xff08;已存在的文件&#xff09; 快捷方式文件名…...

socket聊天室--socket的建立

socket聊天室–socket实现 文章目录 socket聊天室--socket实现socket()bind()listen()accept()connect()发送接收read()函数recv()函数write()函数send()函数close()关闭套接字IP 地址格式转换函数socket() #include <sys/types...

Raft图文详解

Raft图文详解 refer to: Raft lecture (Raft user study) - YouTube Raft PDF Raft算法详解 - 知乎 (zhihu.com) 今天来详细介绍一下Raft协议 Raft是来解决公式问题的协议&#xff0c;那么什么是共识呢&#xff1f; 在分布式系统里面&#xff0c;consensus指的是多个节点对…...

春季出游,学会这些功能,让你旅途更舒心

春意盎然&#xff0c;万物复苏&#xff0c;春天正是旅游观光的好时节&#xff0c;相信不少小伙伴已经做好了出游的准备。想拥有好的心情&#xff0c;除了美食美景&#xff0c;好的出游神器也必不可少&#xff0c;好的出游神器能让我们的旅途更舒心&#xff0c;一起来看看是哪些…...

【华为OD机试真题java、python、c++、jsNode】简单的自动曝光【2022 Q4 100分】(100%通过)

代码请进行一定修改后使用,本代码保证100%通过率。本文章提供java、python、c++、jsNode四种代码 题目描述 一个图像有n个像素点,存储在一个长度为n的数组img里,每个像素点的取值范围[0,255]的正整数。 请你给图像每个像素点值加上一个整数k(可以是负数),得到新图newImg…...

react学习笔记-1:创建项目

安装nodejs https://nodejs.org/dist/v18.14.2/node-v18.14.2-x64.msi 修改国内源&#xff1a;npm config set registry https://registry.npm.taobao.org 使用create-react-app脚手架创建项目 安装脚手架 npm install -g create-react-app 全局安装&#xff0c;可以在任意的…...

vulnhub five86-2

总结&#xff1a;sudo -l&#xff0c;抓流量包&#xff0c;搜索引擎。。 目录 下载地址 漏洞分析 信息收集 网站渗透 ​编辑 反弹shell提权 下载地址 Five86-2.zip (Size: 1.7 GB)Download (Mirror): https://download.vulnhub.com/five86/Five86-2.zip使用&#xff1a;下…...

OpenCV入门(四)快速学会OpenCV3画基本图形

OpenCV入门&#xff08;四&#xff09;快速学会OpenCV3画基本图形 1.画点 在OpenCV中&#xff0c;点分为2D平面中的点和3D平面中的点&#xff0c;区别就是3D中点多了一个z坐标。我们首先介绍2D中的点&#xff0c;坐标为整数的点可以直接用(x, y)代替&#xff0c;其中x是横坐标…...

【MAC OS 命令行】Redis的安装、启动和停止。就是如此简单

目录Mac 安装 Redis使用 Homebrew 安装 Redis总结Mac 安装 Redis 使用 Homebrew 安装 Redis 如果没有安装 Homebrew&#xff0c;先安装 Homebrew 执行命令&#xff1a; 方法一、brew 官网的安装脚本 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homeb…...

8088单板机DIY--串口转换(一)

1.USB转232电路2.功能测试打开设备管理器&#xff0c;可以看到新增的串口。3.通讯测试短接发送和接收&#xff0c;进行自发自收测试。...

KeyboardChatterBlocker:彻底解决机械键盘连击问题的免费开源方案

KeyboardChatterBlocker&#xff1a;彻底解决机械键盘连击问题的免费开源方案 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 机械键盘在…...

专利撰写难、公开不规范,patent-disclosure-skill:一站式专利公开技巧工具,搞定专利文书规范撰写难题

在知识产权越来越受重视的当下&#xff0c;不管是科研人员、技术开发者&#xff0c;还是企业知识产权相关从业者&#xff0c;在专利相关工作中&#xff0c;总会遇到各种各样的棘手问题。 很多人深耕技术研发&#xff0c;好不容易做出创新成果&#xff0c;可一到专利公开、文书梳…...

Windows平台终极PDF处理指南:Poppler工具集完整解决方案

Windows平台终极PDF处理指南&#xff1a;Poppler工具集完整解决方案 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows系统上繁琐的PDF…...

在线考试系统如何实现随机组卷

在现代教育和企业培训中&#xff0c;考试是评估学习效果、提升培训效率的重要工具。然而&#xff0c;传统的固定试卷模式存在诸多问题&#xff1a;题目重复率高、考试公平性难以保障、人工管理成本高。随着在线培训的发展&#xff0c;尤其是在大规模培训场景下&#xff0c;随机…...

如何快速搭建Sunshine游戏串流服务器:终极自托管指南

如何快速搭建Sunshine游戏串流服务器&#xff1a;终极自托管指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏吗&#xff1f;Sunshine开源游戏串流服…...

2025年AI编程工具横评:Cursor vs Windsurf vs Copilot vs DeepClaude深度实测

...

S32K3 FlexCAN实战:从MCAL配置到DMA接收,手把手教你避开那些手册里没写的坑

S32K3 FlexCAN深度实战&#xff1a;从寄存器配置到DMA优化全链路解析 在车载电子架构快速迭代的今天&#xff0c;S32K3系列MCU凭借其强大的FlexCAN模块成为汽车电子开发者的首选。但官方文档往往只勾勒出理想状态下的功能框架&#xff0c;当工程师真正着手实现CAN FD通信时&…...

FPGA在软件无线电系统中的并行处理与动态重配置技术

1. FPGA在软件无线电系统中的核心价值FPGA&#xff08;现场可编程门阵列&#xff09;已成为现代软件无线电&#xff08;SDR&#xff09;系统的核心处理引擎。与传统DSP处理器相比&#xff0c;FPGA凭借其并行架构和可重构特性&#xff0c;在实时信号处理领域展现出独特优势。在典…...

Sutton《苦涩的教训》早已预言:一切**人工精巧设计的专用智能系统**,终将被算力与数据驱动的通用范式无情取代

《The Bitter Lesson》《苦涩的教训》3条极简核心背诵版 人类总爱把领域知识、手工设计、精巧架构塞进AI&#xff0c;短期有用&#xff0c;长远全没用。AI 历史规律&#xff1a;通用规模化&#xff08;算力数据大模型&#xff09;永远碾压 人工定制智能小系统。未来趋势&#x…...