C语言实现常用排序算法

C语言实现常用排序算法

排序是计算机科学中最基础且最常见的操作之一。无论是数据处理、信息检索,还是各种算法应用中,排序算法都发挥着至关重要的作用。在这篇博客中,我们将详细讲解C语言中实现的常见排序算法,并结合实例进行详细分析。

1. 冒泡排序(Bubble Sort)

算法原理:

冒泡排序是一种简单的排序算法,它通过重复交换相邻的未排序元素,将较大的元素“冒泡”到序列的末尾,直到整个序列有序。

算法步骤:

  1. 比较相邻的元素。如果第一个比第二个大,则交换它们。
  2. 对每一对相邻元素重复上述步骤,直到最后一个元素。
  3. 每次比较后,最大的元素会“冒泡”到最后。
  4. 重复上述过程,直到没有需要交换的元素。

示例代码:

#include <stdio.h>void bubbleSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {  // 外层循环控制排序轮数for (int j = 0; j < n - i - 1; j++) {  // 内层循环进行相邻元素比较if (arr[j] > arr[j + 1]) {// 交换相邻元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组: ");printArray(arr, n);bubbleSort(arr, n);printf("排序后数组: ");printArray(arr, n);return 0;
}

输出:

原始数组: 64 34 25 12 22 11 90
排序后数组: 11 12 22 25 34 64 90

时间复杂度:

  • 最优:O(n)(当数组已排好序时)
  • 最差:O(n²)(数组逆序时)
  • 平均:O(n²)

2. 选择排序(Selection Sort)

算法原理:

选择排序通过每一轮选择未排序部分中的最小元素并将其放到已排序部分的末尾,逐步完成排序。

算法步骤:

  1. 在未排序部分选择最小的元素。
  2. 将最小元素与未排序部分的第一个元素交换。
  3. 重复此过程,直到整个数组有序。

示例代码:

#include <stdio.h>void selectionSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}// 交换最小元素与当前元素int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}
}void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组: ");printArray(arr, n);selectionSort(arr, n);printf("排序后数组: ");printArray(arr, n);return 0;
}

输出:

原始数组: 64 25 12 22 11
排序后数组: 11 12 22 25 64

时间复杂度:

  • 最优:O(n²)
  • 最差:O(n²)
  • 平均:O(n²)

3. 插入排序(Insertion Sort)

算法原理:

插入排序将每个元素插入到已排序部分的合适位置,直到整个数组有序。它类似于玩扑克牌时,手中不断插入新牌的过程。

算法步骤:

  1. 从第二个元素开始,依次将每个元素与已排序部分比较。
  2. 将当前元素插入到正确的位置。
  3. 重复此过程,直到数组有序。

示例代码:

#include <stdio.h>void insertionSort(int arr[], int n) {for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;// 将比key大的元素往后移动一位while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}// 将key插入到正确的位置arr[j + 1] = key;}
}void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {12, 11, 13, 5, 6};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组: ");printArray(arr, n);insertionSort(arr, n);printf("排序后数组: ");printArray(arr, n);return 0;
}

输出:

原始数组: 12 11 13 5 6
排序后数组: 5 6 11 12 13

时间复杂度:

  • 最优:O(n)(当数组已排好序时)
  • 最差:O(n²)(数组逆序时)
  • 平均:O(n²)

4. 快速排序(Quick Sort)

算法原理:

快速排序是一种分治算法,通过选择一个基准元素,将数组分成两部分,使得一部分比基准小,另一部分比基准大。然后递归地对这两部分继续进行快速排序。

算法步骤:

  1. 选择一个基准元素。
  2. 将比基准小的元素移动到基准左边,比基准大的元素移动到基准右边。
  3. 对左右两部分递归进行快速排序。

示例代码:

#include <stdio.h>int partition(int arr[], int low, int high) {int pivot = arr[high];int i = (low - 1);for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;// 交换元素int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 将基准元素与i+1位置的元素交换int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return (i + 1);
}void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);  // 对基准左边部分递归排序quickSort(arr, pi + 1, high); // 对基准右边部分递归排序}
}void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {10, 7, 8, 9, 1, 5};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组: ");printArray(arr, n);quickSort(arr, 0, n - 1);printf("排序后数组: ");printArray(arr, n);return 0;
}

输出:

原始数组: 10 7 8 9 1 5
排序后数组: 1 5 7 8 9 10

时间复杂度:

  • 最优:O(n log n)
  • 最差:O(n²)(当数组已按降序排列时)
  • 平均:O(n log n)

总结:

在C语言中,排序算法有许多种,每种算法有其独特的适用场景。冒泡排序、选择排序、插入排序适合处理小规模数据,而快速排序由于其较优的性能,常用于较大数据量的排序。选择合适的排序算法可以有效提升程序的运行效率。

希望本文帮助你深入理解了几种常见的排序算法及其实现!

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

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

相关文章

基于java web在线商城购物系统源码+论文

一、环境信息 开发语言&#xff1a;JAVA JDK版本&#xff1a;JDK8及以上 数据库&#xff1a;MySql5.6及以上 Maven版本&#xff1a;任意版本 操作系统&#xff1a;Windows、macOS 开发工具&#xff1a;Idea、Eclipse、MyEclipse 开发框架&#xff1a;SpringbootHTMLjQueryMysq…

光谱相机在农业的应用

一、作物生长监测1、营养状况评估 原理&#xff1a;不同的营养元素在植物体内的含量变化会导致植物叶片或其他组织的光谱反射率特性发生改变。例如&#xff0c;氮元素是植物叶绿素的重要组成部分&#xff0c;植物缺氮时&#xff0c;叶绿素含量下降&#xff0c;其在可见光波段&a…

【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 每个 WPS 程序的功能程序1&#xff1a;geogrid程序2&#xff1a;ungrib程序3&#xff1a;metgrid WPS运行&#xff08;Running the WPS&#xff09;步骤1&#xff1a;Define model domains with geogrid步骤2&#xff1a;Extract…

桌面图形界面生成原理:从流水灯到电脑屏幕

桌面图形界面是我们在使用电脑时接触最多的一个部分。它的美观、简洁、易用都给我们的生活带来了极大的便利。但是&#xff0c;你是否想过&#xff0c;这样的界面是如何生成的呢&#xff1f;让我们从流水灯的原理开始&#xff0c;一步步揭开桌面图形界面生成的奥秘。 一、流水…

IIC I2C子协议 SMBus协议 通信协议原理 时序 SMBus深度剖析

引言&#xff1a;系统管理总线&#xff08;SMBus&#xff09;是一种双线接口&#xff0c;通过该接口&#xff0c;各种系统组件芯片和设备可以相互以及与系统其他部分通信。它基于IC总线的操作原理。附录B提供了一些SMBus特性与IC总线不同的方式的描述。 SMBus为系统和电源管理相…

深入浅出:内网黄金票据与白银票据

在域环境中&#xff0c;Kerberos认证是确保安全通信的基石&#xff0c;而黄金票据和白银票据则是攻击者常用的两种经典手段。为了帮助大家更形象地理解它们的工作原理及防御措施&#xff0c;我们不妨将其与在私人电影院购票的情景做类比。具体内容参考如下图示即可&#xff1a;…

三维天地ELN助力职业卫生领域实验室无纸化、自动化

平台简介 随着国家对环保行业的日益重视,与环保行业息息相关的检测行业方法体系也越来越完善和规范。北京三维天地科技股份有限公司(以下简称“三维天地”)长期以来专注于实验室数智化建设,在环保行业拥有众多成功案例,通过自主研发的实验室信息管理系统(SW-LIMS),为客户提供完…

【渗透测试】|brupsuit的使用

一、 1.1爆破模块&#xff1a; 1、将拦截发送到intruder模块 2、在intruder模块设置pyaload位置 3、选择攻击类型 4、 5、设置好攻击类型和payload集就可以点击开始攻击&#xff0c;点击后弹出具体攻击详情 6、【payloads】模块相关 6.1 payload集为【简单列表】 添加&…

SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频

要使用阿里云视频点播&#xff08;VOD&#xff09;实现一个教育网站&#xff0c;其中用户需要成为会员后才能查看视频&#xff0c;这个过程包括上传视频、设置权限控制、构建前端播放页面以及确保只有付费会员可以访问视频内容。 1. 视频上传与管理 创建阿里云账号&#xff…

Docker搭建kafka环境

系统&#xff1a;MacOS Sonoma 14.1 Docker版本&#xff1a;Docker version 27.3.1, build ce12230 Docker desktop版本&#xff1a;Docker Desktop 4.36.0 (175267) 1.拉取镜像 先打开Docker Desktop&#xff0c;然后在终端执行命令 docker pull lensesio/fast-data-dev …

B树的性质和插入过程

性质 平衡性&#xff1a;所有叶子节点都在同一层多路&#xff1a;m 阶 B 树 最多&#xff1a; m 个分支&#xff0c;m-1 个元素 最少&#xff1a; 根节点 2 个分支 1个元素 其他节点 ⌈ m / 2 ⌉ \lceil m/2\rceil ⌈m/2⌉ 个分支 ⌈ m / 2 ⌉ \lceil m/2\rceil ⌈m/2⌉ −…

基于预测反馈的情感分析情境学习

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Qt设置部件的阴影效果

QT中的比如QWidget,QLabel,QPushbutton&#xff0c;QCheckBox都可以设置阴影效果&#xff0c;就像这样&#xff1a; 以QWidget为例&#xff0c;开始尝试使用样式表的形式添加阴影&#xff0c;但没有效果&#xff0c;写法如下&#xff1a; QWidget#widget1::shadow{color: rgb…

AS-REP Roasting离线爆破攻击

针对一个域内用户&#xff0c;其账户选项有个设置叫作 “不要求 kerberos 预身份验证”&#xff0c;它默认是关闭的。 当 “不要求 kerberos 预身份验证” 选项被勾选&#xff0c;会出现以下效果&#xff1a; as-req 报文中不需要添加用户 hash 加密的时间戳&#xff0c;自动返…

JMeter配置原件-计数器

一、面临的问题&#xff1a; 由于本人的【函数助手对话框】中counter计数器每次加2&#xff0c;且只显示偶数(如下图所示)&#xff0c;因此借助【配置原件-计数器】来实现计数功能。 如果有大佬知道解决方式&#xff0c;麻烦评论区解答一下&#xff0c;谢谢。 二、配置原件-c…

基于“2+1 链动模式商城小程序”的微商服务营销策略探究

摘要&#xff1a;本文探讨在竞争激烈的市场经济与移动互联网时代背景下&#xff0c;微商面临的机遇与挑战。着重分析“21 链动模式商城小程序”如何助力微商改变思路&#xff0c;通过重视服务、提升服务质量&#xff0c;以服务营销放大利润&#xff0c;实现从传统微商模式向更具…

Grad-CAM-解释CNN决策过程的可视化技术

Grad-CAM&#xff08;Gradient-weighted Class Activation Mapping&#xff09;是一种用于解释卷积神经网络&#xff08;CNN&#xff09;决策过程的可视化技术。其核心思想是通过计算分类分数相对于网络确定的卷积特征的梯度&#xff0c;来识别图像中哪些部分对分类结果最为重要…

文件防泄漏 | 文件防泄漏软件解决方案分享,网络数据泄露防护系统

文件防泄漏 | 文件防泄漏软件解决方案分享&#xff0c;网络数据泄露防护系统 企业面临的一大挑战是数据安全和隐私保护。 网络数据泄露不仅会导致经济损失&#xff0c;还会损害企业的声誉和客户关系。 为了应对这一挑战&#xff0c;域智盾软件应运而生&#xff0c;成为众多企…

EGO Swarm翻译

目录 摘要 Ⅰ 介绍 Ⅱ 相关工作 A . 单四旋翼局部规划 B . 拓扑规划 C. 分布式无人机集群 Ⅲ 基于梯度的局部规划隐式拓扑轨迹生成 A.无需ESDF梯度的局部路径规划 B.隐式拓扑轨迹生成 Ⅳ 无人机集群导航 A 机间避碰 B. 定位漂移补偿 C. 从深度图像中去除agent Ⅴ …

直流充电桩基本工作原理

1、控制导引电路 2、电动汽车直流快充工作原理 1&#xff09;第一阶段 未充电自然状态阶段 充电枪处于自然阶段&#xff0c;充电枪上的按钮没有按下&#xff0c;也就是电路图中的开关S处于接通状态&#xff0c;此时R1 、 R2串联&#xff0c;检测点1处的电压为6V 2&#xff09;…