数据结构及算法--排序篇
在 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 语言中,可以通过嵌套循环和比较运算符来实现常见的排序算法,比如冒泡排序、选择排序或插入排序 目录 基础算法: 1.冒泡排序(Bubble Sort) 2.选择排序(Selection Sort) 3.插入排序&…...
泷羽sec学习打卡-网络七层杀伤链1
声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于蓝队基础的那些事儿-Base1 基本的企业网络架构是怎样的呢?高层管理IT管理影子IT中央技术…...
【QT】绘图
个人主页~ 绘图 一、绘图1、基础内容2、绘制形状(1)线段(2)矩形(3)圆形(4)文本(5)画笔(6)画刷 3、绘制图片(1)…...
vue3+elementui-plus el-dialog全局配置点击空白处不关闭弹窗
在与main.ts同级下的plugins文件夹(如果没有,新建一个)下建一个element.js文件(名字随便取) element.js文件内容如下: import ElementPlus from element-plus export default (app) > {console.log(app…...
Markdown语法说明
这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...
推荐一款专业电脑护眼工具:CareUEyes Pro
CareUEyes Pro是一款非常好用的专业电脑护眼工具,软件小巧,界面简单,它可以自动过滤电脑屏幕的蓝光,让屏幕显示更加的不伤眼,更加舒适,有效保护你的眼睛,可以自定义调节屏幕的色调,从…...
对subprocess启动的子进程使用VSCode python debugger
文章目录 1 情况概要(和文件结构)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. 配置项目全局设置:启用国际化2. 编写视图函数3. 配置路由4. 界面演示5、扩展自动识别并切换到当前语言设置语言并保存到Session设置语言并保存到 Cookie ⭐注意⭐ 以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能&am…...
基于单片机的多功能跑步机控制系统
本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器,由七个电路模块组成,分别是:单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中,单片机模块是整个…...
VSCode 如何选中包含某个字母的所有行
文章目录 写在前面一、需求描述二、解决方法参考链接 写在前面 自己的测试环境:VSCode 一、需求描述 由于需要处理文件,需求是删除文件中包含某个字母的所有行。 二、解决方法 在 Visual Studio Code (VSCode) 中,如果你想选中所有包含某…...
CSRF保护--laravel进阶篇
laravel对csrf非常重视,专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久,那么您可能对于web.php路由文件的post请求很疑惑,因为get请求很顺利,而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的c…...
计算机网络-理论部分(二):应用层
网络应用体系结构 Client-Server客户-服务器体系结构:如Web,FTP,Telnet等Peer-Peer:点对点P2P结构,如BitTorrent 应用层协议定义了: 交换的报文类型,请求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:私钥的有效期(天) # alias:私钥别称 # keystore:私钥库文件名称(生成在当前目录) # storepass:私钥库密码…...
es写入磁盘的过程以及相关优化
数据写入到内存buffer同时写入到数据到translog buffer,这是为了防止数据不会丢失每隔1s数据从buffer中refresh到FileSystemCache中,生成segment文件,这是因为写入磁盘的过程相对耗时,借助FileSystemCache,一旦生成segment文件,就能通过索引查询到了refresh完,memory bu…...
十大网络安全事件
一、私有云平台遭攻击,美国数千家公司工资难以发放 1月,专门提供劳动力与人力资本管理解决方案的美国克罗诺斯(Kronos)公司私有云平台遭勒索软件攻击,事件造成的混乱在数百万人中蔓延。 克罗诺斯母公司UKG集团…...
【数据结构】【线性表】栈的基本概念(附c语言源码)
栈的基本概念 讲基本概念还是回到数据结构的三要素:逻辑结构,物理结构和数据运算。 从逻辑结构来讲,栈的各个数据元素之间是通过是一对一的线性连接,因此栈也是属于线性表的一种从物理结构来说,栈可以是顺序存储和顺…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
