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

数据结构及算法--排序篇

在 C 语言中,可以通过嵌套循环和比较运算符来实现常见的排序算法,比如冒泡排序选择排序插入排序

目录

基础算法:

1.冒泡排序(Bubble Sort)

2.选择排序(Selection Sort)

3.插入排序(Insertion Sort)

高级算法:

1. 快速排序(Quick Sort)

2. 归并排序(Merge Sort)

3. 堆排序(Heap Sort)


基础算法(简单易实现):冒泡排序、选择排序、插入排序

高级算法(性能更优):快速排序、归并排序、堆排序

基础算法:

1. 冒泡排序(Bubble Sort)

冒泡排序是简单直观的排序方法,通过多次比较相邻元素交换位置来排序。

#include <stdio.h>void bubbleSort(int arr[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) { // 如果当前元素大于后一个元素,则交换int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main() {int arr[] = {5, 2, 8, 3, 7};int size = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");bubbleSort(arr, size);printf("排序后: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

备注说明:这里在内循环,j<size-i-1的目的是:因为每进行一次外层循环,数组末尾的一个最大元素会被排序好,因此后续的内层循环会减少比较的次数。

2.选择排序(Selection Sort)

选择排序通过在未排序部分找到最小(最大)元素,然后将其与未排序部分的第一个元素交换位置。

#include <stdio.h>void selectionSort(int arr[], int size) {for (int i = 0; i < size - 1; i++) {int minIndex = i; // 假设当前元素是最小值for (int j = i + 1; j < size; j++) {if (arr[j] < arr[minIndex]) {minIndex = j; // 找到更小的元素}}// 交换最小值和当前位置int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}
}int main() {int arr[] = {5, 2, 8, 3, 7};int size = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");selectionSort(arr, size);printf("排序后: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

备注说明:

3.插入排序(Insertion Sort)

插入排序通过逐步将未排序部分的元素插入到已排序部分的正确位置来排序

#include <stdio.h>void insertionSort(int arr[], int size) {for (int i = 1; i < size; i++) {int key = arr[i]; // 当前要插入的元素int j = i - 1;// 将已排序部分的元素向右移动,直到找到正确的位置while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}
}int main() {int arr[] = {5, 2, 8, 3, 7};int size = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");insertionSort(arr, size);printf("排序后: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

高级算法:

1. 快速排序(Quick Sort)

快速排序是一种分治算法,通过选定一个“基准”(pivot),将数组分为两部分,递归排序子数组。

#include <stdio.h>void quickSort(int arr[], int low, int high) {if (low < high) {int pivot = arr[low]; // 基准int i = low, j = high;while (i < j) {while (i < j && arr[j] >= pivot) j--; // 从右向左找小于基准的if (i < j) arr[i++] = arr[j];        // 放到左边while (i < j && arr[i] <= pivot) i++; // 从左向右找大于基准的if (i < j) arr[j--] = arr[i];        // 放到右边}arr[i] = pivot; // 基准放在最终位置quickSort(arr, low, i - 1); // 排序左边部分quickSort(arr, i + 1, high); // 排序右边部分}
}int main() {int arr[] = {5, 2, 8, 3, 7};int size = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");quickSort(arr, 0, size - 1);printf("排序后: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

2. 归并排序(Merge Sort)

归并排序也是一种分治算法,分为两部分分别排序,再合并为有序数组。

#include <stdio.h>void merge(int arr[], int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;int L[n1], R[n2];// 将数据复制到临时数组for (int i = 0; i < n1; i++) L[i] = arr[left + i];for (int i = 0; i < n2; i++) R[i] = arr[mid + 1 + i];int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k++] = L[i++];} else {arr[k++] = R[j++];}}while (i < n1) arr[k++] = L[i++];while (j < n2) arr[k++] = R[j++];
}void mergeSort(int arr[], int left, int right) {if (left < right) {int mid = left + (right - left) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}
}int main() {int arr[] = {5, 2, 8, 3, 7};int size = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");mergeSort(arr, 0, size - 1);printf("排序后: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

3. 堆排序(Heap Sort)

堆排序通过构造一个堆(最大堆或最小堆)来实现排序。

#include <stdio.h>void heapify(int arr[], int size, int root) {int largest = root;int left = 2 * root + 1;int right = 2 * root + 2;if (left < size && arr[left] > arr[largest]) largest = left;if (right < size && arr[right] > arr[largest]) largest = right;if (largest != root) {int temp = arr[root];arr[root] = arr[largest];arr[largest] = temp;heapify(arr, size, largest);}
}void heapSort(int arr[], int size) {// 构建最大堆for (int i = size / 2 - 1; i >= 0; i--) {heapify(arr, size, i);}// 逐步将堆顶元素交换到数组末尾,并调整堆for (int i = size - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}
}int main() {int arr[] = {5, 2, 8, 3, 7};int size = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");heapSort(arr, size);printf("排序后: ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

相关文章:

数据结构及算法--排序篇

在 C 语言中&#xff0c;可以通过嵌套循环和比较运算符来实现常见的排序算法&#xff0c;比如冒泡排序、选择排序或插入排序 目录 基础算法&#xff1a; 1.冒泡排序&#xff08;Bubble Sort&#xff09; 2.选择排序&#xff08;Selection Sort&#xff09; 3.插入排序&…...

泷羽sec学习打卡-网络七层杀伤链1

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于蓝队基础的那些事儿-Base1 基本的企业网络架构是怎样的呢&#xff1f;高层管理IT管理影子IT中央技术…...

【QT】绘图

个人主页~ 绘图 一、绘图1、基础内容2、绘制形状&#xff08;1&#xff09;线段&#xff08;2&#xff09;矩形&#xff08;3&#xff09;圆形&#xff08;4&#xff09;文本&#xff08;5&#xff09;画笔&#xff08;6&#xff09;画刷 3、绘制图片&#xff08;1&#xff09;…...

vue3+elementui-plus el-dialog全局配置点击空白处不关闭弹窗

在与main.ts同级下的plugins文件夹&#xff08;如果没有&#xff0c;新建一个&#xff09;下建一个element.js文件&#xff08;名字随便取&#xff09; element.js文件内容如下&#xff1a; import ElementPlus from element-plus export default (app) > {console.log(app…...

Markdown语法说明

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

推荐一款专业电脑护眼工具:CareUEyes Pro

CareUEyes Pro是一款非常好用的专业电脑护眼工具&#xff0c;软件小巧&#xff0c;界面简单&#xff0c;它可以自动过滤电脑屏幕的蓝光&#xff0c;让屏幕显示更加的不伤眼&#xff0c;更加舒适&#xff0c;有效保护你的眼睛&#xff0c;可以自定义调节屏幕的色调&#xff0c;从…...

对subprocess启动的子进程使用VSCode python debugger

文章目录 1 情况概要&#xff08;和文件结构&#xff09;2 具体设置和启动步骤2.1 具体配置Step 1 针对attach debugger到子进程Step 2 针对子进程的暂停(可选) Step 3 判断哪个进程id是需要的子进程 2.2 启动步骤和过程 3 其他问题解决3.13.2 ptrace: Operation not permitted…...

Django启用国际化支持(2)—实现界面内切换语言:activate()

文章目录 ⭐注意⭐1. 配置项目全局设置&#xff1a;启用国际化2. 编写视图函数3. 配置路由4. 界面演示5、扩展自动识别并切换到当前语言设置语言并保存到Session设置语言并保存到 Cookie ⭐注意⭐ 以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能&am…...

基于单片机的多功能跑步机控制系统

本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器&#xff0c;由七个电路模块组成&#xff0c;分别是&#xff1a;单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中&#xff0c;单片机模块是整个…...

VSCode 如何选中包含某个字母的所有行

文章目录 写在前面一、需求描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a;VSCode 一、需求描述 由于需要处理文件&#xff0c;需求是删除文件中包含某个字母的所有行。 二、解决方法 在 Visual Studio Code (VSCode) 中&#xff0c;如果你想选中所有包含某…...

CSRF保护--laravel进阶篇

laravel对csrf非常重视&#xff0c;专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久&#xff0c;那么您可能对于web.php路由文件的post请求很疑惑&#xff0c;因为get请求很顺利&#xff0c;而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的c…...

计算机网络-理论部分(二):应用层

网络应用体系结构 Client-Server客户-服务器体系结构&#xff1a;如Web&#xff0c;FTP&#xff0c;Telnet等Peer-Peer&#xff1a;点对点P2P结构&#xff0c;如BitTorrent 应用层协议定义了&#xff1a; 交换的报文类型&#xff0c;请求or响应报文类型的语法字段的含义如何…...

k8s1.31版本最新版本集群使用容器镜像仓库Harbor

虚拟机 rocky9.4 linux master node01 node02 已部署k8s集群版本 1.31 方法 一 使用容器部署harbor (1) wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce systemctl enable docker…...

QT中使用json格式存取矩阵数据

在 Qt 中,可以通过 QJsonDocument 和 QJsonArray 方便地存取 JSON 格式的矩阵数据。以下是存储和读取矩阵数据的完整实现示例。 1. 矩阵存储为 JSON 将矩阵(QVector<QVector<double>> 或其他二维数组)存储为 JSON 文件。 实现代码 #include <QJsonArray&g…...

k8s 集群安装

安装rockylinux https://www.jianshu.com/p/a5fe20318b8e https://www.cnblogs.com/haoee/p/18290506 配置VirtualBox双网卡 https://www.cnblogs.com/ShineLeBlog/p/17580311.html https://zhuanlan.zhihu.com/p/341328334 https://blog.csdn.net/qq_36544785/article/deta…...

Elasticsearch面试内容整理-核心概念与数据模型

在 Elasticsearch 中,理解核心概念与数据模型是非常重要的,因为它们定义了数据如何被组织、存储和搜索。以下是 Elasticsearch 的核心概念和数据模型的详细介绍。 核心概念 集群(Cluster) ● 集群是由一个或多个节点组成的,用于共同存储和搜索数据的集合。...

Spring Boot实现License生成和校验

Spring Boot实现License生成和校验 证书准备 # 1. 生成私钥库 # validity&#xff1a;私钥的有效期&#xff08;天&#xff09; # alias&#xff1a;私钥别称 # keystore&#xff1a;私钥库文件名称&#xff08;生成在当前目录&#xff09; # storepass&#xff1a;私钥库密码…...

es写入磁盘的过程以及相关优化

数据写入到内存buffer同时写入到数据到translog buffer,这是为了防止数据不会丢失每隔1s数据从buffer中refresh到FileSystemCache中,生成segment文件,这是因为写入磁盘的过程相对耗时,借助FileSystemCache,一旦生成segment文件,就能通过索引查询到了refresh完,memory bu…...

十大网络安全事件

一、私有云平台遭攻击&#xff0c;美国数千家公司工资难以发放 1月&#xff0c;专门提供劳动力与人力资本管理解决方案的美国克罗诺斯&#xff08;Kronos&#xff09;公司私有云平台遭勒索软件攻击&#xff0c;事件造成的混乱在数百万人中蔓延。 克罗诺斯母公司UKG集团&#xf…...

【数据结构】【线性表】栈的基本概念(附c语言源码)

栈的基本概念 讲基本概念还是回到数据结构的三要素&#xff1a;逻辑结构&#xff0c;物理结构和数据运算。 从逻辑结构来讲&#xff0c;栈的各个数据元素之间是通过是一对一的线性连接&#xff0c;因此栈也是属于线性表的一种从物理结构来说&#xff0c;栈可以是顺序存储和顺…...

如何彻底解决Cursor API限制问题:从免费到Pro的完整指南

如何彻底解决Cursor API限制问题&#xff1a;从免费到Pro的完整指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your t…...

让 TDengine 在 JetBrains IDEs 里更像“原生数据库”一点

让 TDengine 在 JetBrains IDEs 里更像“原生数据库”一点 Author: ChangJin Wei (魏昌进) 最近我做了一个小插件&#xff0c;把 TDengine 接入到了 JetBrains IDEs 的数据库工具链里。 先埋个小提示&#xff1a;文末有彩蛋。 项目地址&#xff1a; GitHub: https://github.…...

wan2.1-vae开源模型价值:相比闭源方案节省90%图像生成API调用成本

wan2.1-vae开源模型价值&#xff1a;相比闭源方案节省90%图像生成API调用成本 你有没有算过&#xff0c;每个月花在AI图像生成上的钱有多少&#xff1f; 如果你是内容创作者、电商运营、设计师&#xff0c;或者任何需要大量图片素材的人&#xff0c;可能已经习惯了这样的场景…...

Bongo Cat功能选择指南:从需求定位到场景化配置

Bongo Cat功能选择指南&#xff1a;从需求定位到场景化配置 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作&#xff0c;每一次输入都充满趣味与活力&#xff01; 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat Bongo Cat是一…...

RMBG-2.0模型量化压缩:减小体积提升速度

RMBG-2.0模型量化压缩&#xff1a;减小体积提升速度 1. 引言 抠图工具RMBG-2.0确实效果惊艳&#xff0c;但原版模型动不动就几个GB的大小&#xff0c;在普通电脑上跑起来慢吞吞的&#xff0c;更别说在手机或边缘设备上部署了。如果你也遇到过模型太大、推理太慢的问题&#x…...

Apache James邮件服务器企业级部署与安全配置指南

Apache James邮件服务器企业级部署与安全配置指南 【免费下载链接】james-project James Project是一个用于电子邮件服务器的开源软件。适用于需要为其邮件基础设施提供强大和可靠的邮件传输代理的企业和组织。具有可扩展性、灵活性和易于使用的特点。 项目地址: https://git…...

G-Helper:华硕笔记本轻量化控制工具全面解析与实战指南

G-Helper&#xff1a;华硕笔记本轻量化控制工具全面解析与实战指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地…...

InstructPix2Pix在.NET平台的应用开发实战

InstructPix2Pix在.NET平台的应用开发实战 1. 引言&#xff1a;当AI修图遇上.NET开发 想象一下这样的场景&#xff1a;电商平台的商品图片需要批量调整风格&#xff0c;摄影工作室想要快速实现创意效果&#xff0c;或者内容创作者需要即时编辑社交媒体图片。传统图像处理方式…...

Chord - Ink Shadow 跨模态应用探索:连接文本与MATLAB科学计算

Chord - Ink & Shadow 跨模态应用探索&#xff1a;连接文本与MATLAB科学计算 你有没有过这样的经历&#xff1f;面对一堆实验数据&#xff0c;脑子里已经想好了要画个什么样的图来分析&#xff0c;但打开MATLAB&#xff0c;却卡在了写代码这一步。复杂的函数名、繁琐的语法…...

WeChatExporter:免费开源工具,轻松备份你的微信聊天记录到电脑

WeChatExporter&#xff1a;免费开源工具&#xff0c;轻松备份你的微信聊天记录到电脑 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾经担心过手机丢失、系统崩…...