常用排序算法的实现与介绍
常用排序算法的实现与介绍
在计算机科学中,排序算法是非常基础且重要的一类算法。本文将通过C语言代码实现,介绍几种常见的排序算法,包括冒泡排序、选择排序、插入排序和快速排序。以下是这些排序算法的具体实现和简要介绍。
1. 冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法,它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。这个过程会重复进行直到没有元素需要交换为止。
void bupsort(TYPE *arr, size_t len) {bool flag = true; // 标记是否发生交换for (size_t i = len - 1; i > 0 && flag; i--) {flag = false;for (size_t j = 0; j < i; j++) {if (arr[j] > arr[j + 1]) {swap(&arr[j], &arr[j + 1]);flag = true; // 发生交换}}}printf("%s\n", __func__);
}
2. 选择排序(Selection Sort)
选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
void select_sort(TYPE *arr, size_t len) {for (size_t i = 0; i < len - 1; i++) {size_t min_index = i;for (size_t j = i + 1; j < len; j++) {if (arr[j] < arr[min_index]) {min_index = j;}}if (min_index != i) {swap(&arr[i], &arr[min_index]);}}printf("%s\n", __func__);
}
3. 插入排序(Insertion Sort)
插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
void insert_sort(TYPE *arr, size_t len) {for (size_t i = 1, j = 0; i < len; i++) {TYPE key = arr[i];for (j = i - 1; j >= 0 && arr[j] > key; j--) {arr[j + 1] = arr[j];}arr[j + 1] = key;}printf("%s\n", __func__);
}
4. 快速排序(Quick Sort)
快速排序是一种分治法的排序算法。它通过选择一个基准元素,将待排序数组分割成两部分,递归地排序两个子数组。
// 处理分区逻辑的函数
int _Qsort(int *arr, int low, int high) {int pivot = arr[high];int index = low - 1;for (int i = low; i < high; i++) {if (arr[i] < pivot) {index++;swap(&arr[i], &arr[index]);}}swap(&arr[index + 1], &arr[high]);return index + 1;
}// 递归调用函数
void _Qsort_recursive(int *arr, int low, int high) {if (low < high) {int pi = _Qsort(arr, low, high);_Qsort_recursive(arr, low, pi - 1);_Qsort_recursive(arr, pi + 1, high);}
}// 公共接口函数
void Qsort(int *arr, size_t len) {if (arr != NULL && len > 0) {_Qsort_recursive(arr, 0, len - 1);}printf("%s\n", __func__);
}
5.希尔排序(shell sort)
//希尔排序
void shell_sort(TYPE *arr, size_t len)
{for(int gap = len / 2; gap > 0; gap /= 2){for(int i = gap,j=0; i < len; i++){TYPE key = arr[i];for(j = i; j-gap >= 0 && arr[j-gap] > key; j -= gap){arr[j] = arr[j-gap];}if(i != j)arr[j] = key;}}
printf("%s\n",__func__);
}
主函数和测试
在主函数中,我们使用一个函数数组分别调用以上几种排序算法,并对随机生成的数组进行排序。
int main() {TYPE arr[LEN];sort_func sorts[] = {bupsort, Qsort, select_sort, insert_sort};for (int i = 0; i < sizeof(sorts) / sizeof(sorts[0]); i++) {for (int j = 0; j < LEN; j++) {arr[j] = rand() % 100; // 填充数组随机值}printf("排序前: ");show_arr(arr, LEN);sorts[i](arr, LEN); // 调用排序函数printf("排序后: ");show_arr(arr, LEN);printf("==========================\n");printf("\n");}return 0;
}
在这个例子中,我们展示了如何使用C语言实现几种常见的排序算法,并通过函数指针数组动态调用不同的排序函数。通过这样的实现方式,可以方便地扩展和测试不同的排序算法。希望本文能帮助读者更好地理解和掌握这些基础的排序算法。
完整代码:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#define TYPE int
#define LEN 15void swap(int *a, int *b)
{int temp = *a;*a = *b;*b = temp;
}
void show_arr(TYPE *arr,size_t len)
{for(size_t i=0;i<len;i++){printf("%d ",arr[i]);}printf("\n");
}
typedef void (*sort_func)(TYPE *arr,size_t len);// 排序函数类型定义//冒泡排序
void bupsort(TYPE *arr,size_t len)
{bool flag=true;// 标记是否发生交换for(size_t i=len-1;i>0&&flag;i--)//发生过交换才继续{flag=false;// 标记是否发生交换for(size_t j=0;j<i;j++){if(arr[j]>arr[j+1]){swap(&arr[j],&arr[j+1]);flag=true;// 发生交换}}}printf("%s\n",__func__);
}//选择排序
void select_sort(TYPE *arr, size_t len) {for (size_t i = 0; i < len - 1; i++) {size_t min_index = i;for (size_t j = i + 1; j < len; j++) {if (arr[j] < arr[min_index]) {min_index = j;}}if (min_index != i) {swap(&arr[i], &arr[min_index]);}}printf("%s\n",__func__);
}//插入排序
void insert_sort(TYPE *arr, size_t len)
{for (size_t i = 1,j=0; i < len; i++) {TYPE key = arr[i];for( j = i - 1; j >= 0 && arr[j] > key; j--){arr[j+1] = arr[j];}arr[j+1] = key;}printf("%s\n",__func__);
}//快速排序
// 处理分区逻辑的函数
int _Qsort(int *arr, int low, int high) {int pivot = arr[high]; // 最后一个元素作为基准int index = low - 1; // 记录小于基准元素的位置for (int i = low; i < high; i++) {if (arr[i] < pivot) {index++;swap(&arr[i], &arr[index]); // 将小于基准的元素移到左边}}swap(&arr[index + 1], &arr[high]); // 将基准元素放到中间return index + 1;
}// 递归调用函数
void _Qsort_recursive(int *arr, int low, int high) {if (low < high) {int pi = _Qsort(arr, low, high);_Qsort_recursive(arr, low, pi - 1); // 排序左半部分_Qsort_recursive(arr, pi + 1, high); // 排序右半部分}
}// 公共接口函数
void Qsort(int *arr, size_t len) {if (arr != NULL && len > 0) {_Qsort_recursive(arr, 0, len - 1);}printf("%s\n",__func__);
}
int main() {TYPE arr[LEN];sort_func sorts[] = {bupsort, Qsort, select_sort , insert_sort};// 排序函数数组for (int i = 0; i < sizeof(sorts) / sizeof(sorts[0]); i++) {for (int j = 0; j < LEN; j++) {arr[j] = rand() % 100; // 填充数组随机值}printf("排序前: ");show_arr(arr, LEN);sorts[i](arr, LEN); // 调用排序函数printf("排序后: ");show_arr(arr, LEN);printf("==========================\n");printf("\n");}return 0;
}
相关文章:

常用排序算法的实现与介绍
常用排序算法的实现与介绍 在计算机科学中,排序算法是非常基础且重要的一类算法。本文将通过C语言代码实现,介绍几种常见的排序算法,包括冒泡排序、选择排序、插入排序和快速排序。以下是这些排序算法的具体实现和简要介绍。 1. 冒泡排序&am…...

仓颉语言 -- 宏
使用新版本 (2024-07-19 16:10发布的) 1、宏的简介 宏可以理解为一种特殊的函数。一般的函数在输入的值上进行计算,然后输出一个新的值,而宏的输入和输出都是程序本身。在输入一段程序(或程序片段,例如表达…...

Nginx代理minIO图片路径实现公网图片访问
1、网络部署情况 VUE前端项目Nginx部署在公司内网,端口7790 后台接口项目部署在公司内网,端口7022 minIO服务部署在公司内网,端口9000 公网IP设备将80端口映射到7790端口(具体映射方式不详),实现通过互…...

从零开始掌握tcpdump:参数详解
Linux tcpdump命令详解 1. 语法 tcpdump [-adeflnnNOpqStvxX] [-c <数据包数目>] [-dd] [-ddd] [-F <表达文件>] [-i <网络界面>] [-r <数据包文件>] [-s <数据包大小>] [-tt] [-T <数据包类型>] [-vv] [-w <数据包文件>] [输出数…...

漏洞挖掘 | edusrc记一次某中学小程序渗透测试
一、搜集渗透目标 现在的EDU挖web端的上分效率远不如小程序,因此这篇文章浅浅记录一次小程序的挖掘吧。如果各位大牛想要快速出洞,不妨跳过大学,学院等小程序,而重点关注小学、中学、幼儿园等,这些小程序的出洞率还是…...

vulhub:nginx解析漏洞CVE-2013-4547
此漏洞为文件名逻辑漏洞,该漏洞在上传图片时,修改其16进制编码可使其绕过策略,导致解析为 php。当Nginx 得到一个用户请求时,首先对 url 进行解析,进行正则匹配,如果匹配到以.php后缀结尾的文件名ÿ…...

备战秋招:2024游戏开发入行与跳槽面试详解
注意:以下为本次分享概要,视频版内容更全面深入,详见文末 1.游戏开发领域秋招准备与面试技巧 本次分享由优梦创客机构的创始人雷蒙德主讲,专注于2024年秋招期间游戏开发领域的入行与跳槽面试准备。本次分享重点在于提供面试技巧…...

红外热成像手持终端:从建筑检测到野外搜救的全方位应用
红外热成像手持终端,凭借其独特的红外探测与夜视功能,广泛应用于多个关键领域。无论是军事侦察、消防救援中的夜间作业,还是电力巡检、野生动物观察等多样场景,其精准的红外热成像技术均能提供至关重要的实时数据,助力…...

day07 项目启动以及git
spring框架 spring 负责整合各种框架,把new对象的部分交给spring去做,对象new不出来,项目就启动不起来,这样可以有效保证所需要的对象都在容器中存在,后续的部分都可以顺利执行控制反转:业务对象创建依赖资…...

学会网络安全:开启广阔职业与责任之旅
在数字化时代,网络安全已成为社会经济发展的重要基石。随着互联网的普及和技术的飞速发展,网络安全威胁日益复杂多变,对国家安全、社会稳定以及个人隐私构成了严峻挑战。因此,掌握网络安全技能不仅意味着拥有了一项高价值的职业技…...

UE5 镜头
只狼镜头 Spring Arm 中 开启 Use Pawn Control Rotation:让镜头跟着鼠标移动BP_Character(Self) 中关闭 Use Controller Rotation Yaw:不要让人物和鼠标移动Character Movement 的 Rotation Setting 中 关闭 Use Controller Desired Rotationÿ…...

SpringBoot如何实现简单的跨域配置
在SpringBoot中实现简单的跨域配置,主要通过全局CORS配置来完成。这通常涉及到实现WebMvcConfigurer接口并覆盖addCorsMappings方法。以下是一个简单的示例,展示了如何在SpringBoot应用中配置CORS策略以允许跨域请求。 首先,需要创建一个配置…...

vue列表进入详情页实现上一篇下一篇功能
概述:需求就是需要可以看列表,然后点击列表的右侧详情看详情,通过详情来实现新增上一份,下一份按钮来实现直接看之后的详情。 网上的解决方法有很多 1.后台获取将全量的id,前台再去直接取下一个id方式。(…...

kalman的python实现
前面的kalman都是matlab的,这里在理解的基础上,尝试使用python实现,力求理解更多的内涵。 需要的包 import numpy as np import matplotlib.pyplot as plt 代码 KF algorith demo by Leo 2020.01.06 ZJG CAMPUS,ZJU import numpy as np…...

查找算法:线性查找,golang实现
目录 前言 线性查找 代码示例 1. 算法包 2. 线性查找代码 3. 模拟程序 4. 运行程序 循环次数 假如目标值正好在数组中的第一位 假如目标值正好在数组中的第五位 假如目标值正好在数组中的最后一位 假如目标值不在数组中 线性查找的思想 1. 顺序遍历 2. 比较 3.…...

【图像识别】十大数据集合集!
本文将为您介绍10个经典、热门的数据集,希望对您在选择适合的数据集时有所帮助。 1 DanishFungi2020 发布方: Google 发布时间: 2021 简介: 补充材料:丹麦真菌 2020 - 不仅仅是另一个图像识别数据集为了支持细粒度植…...

C++ | Leetcode C++题解之第312题戳气球
题目: 题解: class Solution { public:int maxCoins(vector<int>& nums) {int n nums.size();vector<vector<int>> rec(n 2, vector<int>(n 2));vector<int> val(n 2);val[0] val[n 1] 1;for (int i 1; i &l…...

SSM学习11:springboot基础
教学视频 黑马程序员SpringBoot3Vue3全套视频教程,springbootvue企业级全栈开发从基础、实战到面试一套通关 springboot基础 搭建项目 修改配置文件 修改application.yml(后缀名不对,可以改成这个),配置数据库 spr…...

【前端 18】安装Node.js
Node.js 安装指南 在今天的博客中,我们将一起探讨如何在您的计算机上安装Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许你在服务器端运行 JavaScript 代码。无论您是前端开发者希望探索全栈开发,还是后端开发者寻…...

C#/Winform入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享
场景 作为一名C#的Winform开发者,势必经历过从入门到自学、从基础到进阶、从学习到强化的过程。 当经历过几年企业级开发的磨炼,再回头看之前的开发过程、成长阶段发现确实是走了好多的弯路。 作为一名终身学习的信奉者,秉承Java体系需持续…...

springboot的表现层/控制层controller开发
第一步:新建文件和注入业务层对象 需要使用的注解: 第一个声明是restful风格开发 第二个是需要设置网页访问路径 RestController RequestMapping("/fuels")//http://localhost/fuels注入服务层对象: Autowiredprivate FuelServ…...

前端使用html2canvas在页面截图并导出,以及截图中含有图片时的跨域问题解决
1.引入html2canvas npm 安装或cdn引入 npm install html2canvas <script src"https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script> 2.使用 html2canvas // 假设你有一个 id 为 "capture" 的元素 h…...

道可云元宇宙每日资讯|第十二届互联网安全大会在北京开幕
道可云元宇宙每日简报(2024年8月2日)讯,今日元宇宙新鲜事有: 第十二届互联网安全大会在北京开幕 7月31日,第十二届互联网安全大会(ISC.AI 2024)在北京国家会议中心盛大开幕。 本届大会以“打造…...

前端面试基础题(微信公众号:前端面试成长之路)
BFC、IFC、GFC、FFC CSS2.1中只有BFC和IFC, CSS3中才有GFC和FFC。 到底什么是BFC、IFC、GFC和FFC Whats FC? 一定不是KFC,FC的全称是:Formatting Contexts,是W3C CSS2.1规范中的一个概念。它是页面中的一块渲染区域,并…...

https执行过程,特点,作用
还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…...

【优秀python案例】基于Python的豆瓣电影TOP250爬虫与可视化设计与实现
摘要:伴随着当代社会物质水平的不断提高,人们越来越注重精神享受,看电影成为人们日常生活中重要的组成成分。本文将针对豆瓣上热门电影评论进行爬取,应用可视化分析更为形象地了解该电影的动态。该系统可以使得人们实时了解到有关…...

如何设计一个测试用例
前言👀~ 上一章我们介绍了什么是软件测试以及软件测试的一些基础概念,今天来聊聊如何设计一个测试用例,涉及到黑盒测试的测试方法 基于需求进行测试用例的设计 基于需求的具体设计方法 等价类 边界值 判定表法 正交表法 场景设计法 …...

黄金和原油市场波动背后的经济信号
黄金市场的波动与经济数据影响 周四,黄金市场经历了一天内的剧烈波动,从早盘的高点到纽约时段的急剧下跌。现货黄金价格最初上涨至2462.29美元/盎司,但随后迅速跌至最低的2434.72美元/盎司。最终,黄金收盘价报2445.84美元/盎司&am…...

【Python数值分析】革命:引领【数学建模】新时代的插值与拟合前沿技术
目录 编辑 第一部分:插值的基本原理及应用 1. 插值的基本原理 1.1 插值多项式 1.2 拉格朗日插值 1.3 牛顿插值 1.4 样条插值 2. 插值的Python实现 2.1 使用 NumPy 进行插值 2.2 使用 SciPy 进行插值 2.2.1 一维插值 编辑 2.2.2 二维插值 3. 插值…...

PCL-基于超体聚类的LCCP点云分割
目录 一、LCCP方法二、代码实现三、实验结果四、总结五、相关链接 一、LCCP方法 LCCP指的是Local Convexity-Constrained Patch,即局部凸约束补丁的意思。LCCP方法的基本思想是在图像中找到局部区域内的凸结构,并将这些结构用于分割图像或提取特征。这种…...