news 2026/4/15 8:07:29

C复习13(排序算法)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C复习13(排序算法)

#技术笔记

1.冒泡排序

这个排序要能自己直接敲出来,由于每一轮有交换,导致数据就像冒泡泡一样,冒到数组的末尾,所以叫做冒泡排序。冒泡排序稳定,时间复杂度O(n^2),空间复杂度O(1) (这里就给出一种代码,从小到大的排序顺序冒了,后面都是按从小到大的顺序排)

void bubble_sort(int *arr, int len) { for (int i = 0; i < len; ++i) { bool swap_flag = false; // 优化的地方 //如果已经排好序了,flag就为false直接结束了 for (int j = 0; j < len - i - 1; ++j) //优化的地方 { if (arr[j] > arr[j + 1]) { SWAP(arr, j, j + 1); //用了个交换宏 swap_flag = true; } } if (swap_flag == false) { break; } arr_print(arr, len); } }

2.选择排序就是划分一个已排序区和未排序区,刚开始都是未排序的,然后选一个最小的放入已排序区,以此类推。选择排序不稳定,平均时间复杂度O(n^2),空间复杂度O(1)。

插入排序就是从左往右,每次把当前的元素往前面已排好序的地方,插入到合适的位置。插入排序稳定,平均时间复杂度O(n^2),空间复杂度O(1)。

希尔排序,插入排序的升级版,先让数组大致有序(按间隔切分子序列),再最后一次插入排序完成排序结果。希尔排序不稳定,平均时间复杂度取决于增量序列,空间复杂度O(1)。

3.快速排序

前面C复习Day10那篇文章用的一个qsort函数(在<stdlib.h>中)就是快速排序函数,具体代码参考源码。快速排序,简而言之,选一个基准,分左右,再递归求解;基准选择好坏就关系时间复杂度了,选不好容易让快排达到选择排序的效果。快速排序稳定,平均时间复杂度O(nlogn),空间复杂度O(logn)。(代码如下)

void parition(int arr[], int left, int right) { if (left >= right) { return; } //一般可以选第一个元素当枢轴位置,这里随机一个 int pivot_index = (rand() % (right - left + 1)) + left; int pivot_value = arr[pivot_index]; SWAP(arr, right, pivot_index); //跟最右边一个交换一下,然后准备从左边开始交换 int cur_l = left; int cur_r = right; while (cur_l < cur_r) { while (cur_l < cur_r && arr[cur_l] < pivot_value) { //说明此次不需要交换,直接继续找要交换的元素 cur_l++; } if (cur_l < cur_r) { arr[cur_r] = arr[cur_l]; } while (cur_l < cur_r && arr[cur_r] >= pivot_value) { cur_r--; } if (cur_l < cur_r) { arr[cur_l] = arr[cur_r]; } } // 上述操作完成, 确定一个枢轴一定在正确的排序位置 arr[cur_l] = pivot_value; parition(arr, left, cur_l - 1); //递归处理剩下的 parition(arr, cur_l + 1, right); } void quick_sort(int arr[], int len) { srand(time(NULL)); //设计一个随机种子值 parition(arr, 0, len - 1); }

4.归并排序

归并排序,就是先拆分成一个一个的元素,再两两合并起来;把数组一分为二一分为二一分为二直到分成一个一个,再递归的把左右的一个个元素排序,再将两个有序数组合并。归并排序稳定,平均时间复杂度O(nlogn),空间复杂度O(n)。

5.堆排序

堆排序,就是把数组当成完全二叉树,反复从堆顶取数据进行排序;建一个大根堆,每次堆顶和最后一个元素交换,堆大小减1,再对新堆顶进行下沉判断,下沉后继续判断,直到恢复大根堆形态,再重复此过程。堆排序不稳定,平均时间复杂度O(nlogn),空间复杂度O(1)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 8:06:27

STM32CubeMX实战指南(小熊派):SPI接口点亮LCD屏的完整流程

1. 硬件准备与环境搭建 第一次拿到小熊派开发板时&#xff0c;我对着这个巴掌大的小玩意儿研究了半天。作为全国大学生物联网竞赛的指定开发板&#xff0c;它的设计确实很贴心——所有外设接口都用彩色丝印标注得清清楚楚&#xff0c;连SPI接口旁边的LCD屏插座都做了防反插设计…

作者头像 李华
网站建设 2026/4/15 8:05:13

昆仑通态屏幕制作(进阶篇)---动态交互设计(滑块控制与状态反馈)

1. 滑块控制的动态联动实现 在工业控制场景中&#xff0c;滑块是最直观的交互控件之一。昆仑通态屏幕的滑块控制功能&#xff0c;可以实现对设备参数的精细调节。比如控制电机转速、调节温度设定值等场景&#xff0c;都需要滑块输入与其他显示元素的动态联动。 1.1 滑块与进度…

作者头像 李华
网站建设 2026/4/15 8:04:30

Wan2.2-I2V-A14B企业级应用:金融产品介绍短视频自动化生成流程

Wan2.2-I2V-A14B企业级应用&#xff1a;金融产品介绍短视频自动化生成流程 1. 金融短视频自动化生成的价值 在金融行业&#xff0c;产品宣传和客户教育面临着独特挑战。传统视频制作需要专业团队、高昂成本和漫长周期&#xff0c;而金融产品更新迭代快、合规要求严格&#xf…

作者头像 李华
网站建设 2026/4/15 8:03:03

从数学到编程

大家好&#xff0c;我是一名大二数学专业学生&#xff0c;正计划跨考计算机研究生。目前在完成数学专业课学习的同时&#xff0c;我已经开启了C语言、数据结构的系统学习&#xff0c;努力完成从数学思维到计算机思维的转型。编程对我而言&#xff0c;是用逻辑搭建现实的全新赛道…

作者头像 李华
网站建设 2026/4/15 8:01:10

学生日常生活管理系统 Python+Django+Vue.js

博主说明&#xff1a;本文项目编号 25010 &#xff0c;文末自助获取源码 \color{red}{25010&#xff0c;文末自助获取源码} 25010&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 需求分析1.2 技术栈 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景和意义…

作者头像 李华