网站首页 > 文章精选 正文
情景回顾
上节回顾:C语言的十大组数之冒泡排序法的应用
本节重点
本节重点:C语言的十大组数排序法:选择排序!竟然可以这么快!
关注不迷路
微信公众号:工控小新
学习工控知识就来工控小新,为你提供工控笔记知识:EPLAN电气绘图 | TIA博图基础 | CAD | C语言教学 | 单片机基础 | 三菱PLC ... 每日持续更新中
选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n^2) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。
本文将介绍选择排序的原理、实现和优缺点,以及如何用C语言编写选择排序的代码。
选择排序的原理
选择排序的基本思想是,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
例如,给定一个数组 arr = [9, 6, 15, 4, 2],我们要对它进行升序排序,那么选择排序的过程如下:
- 第一轮,从 arr[0] 到 arr[4] 中找到最小的元素 arr[4] = 2,将它与 arr[0] 交换,得到 arr = [2, 6, 15, 4, 9]。
- 第二轮,从 arr[1] 到 arr[4] 中找到最小的元素 arr[3] = 4,将它与 arr[1] 交换,得到 arr = [2, 4, 15, 6, 9]。
- 第三轮,从 arr[2] 到 arr[4] 中找到最小的元素 arr[3] = 6,将它与 arr[2] 交换,得到 arr = [2, 4, 6, 15, 9]。
- 第四轮,从 arr[3] 到 arr[4] 中找到最小的元素 arr[4] = 9,将它与 arr[3] 交换,得到 arr = [2, 4, 6, 9, 15]。
此时,所有元素已经排序完毕,选择排序结束。
选择排序的实现
要用C语言实现选择排序,我们需要定义一个函数,接受一个数组和它的长度作为参数,然后对数组进行选择排序。我们还需要定义一个辅助函数,用来交换两个元素的值。代码如下
// 交换两个元素的值
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
// 选择排序
void selection_sort(int arr[], int n)
{
// i 表示已排序序列的末尾
for (int i = 0; i < n - 1; i++)
{
// min_index 表示未排序序列中最小元素的下标
int min_index = i;
// j 用来遍历未排序序列,寻找最小元素
for (int j = i + 1; j < n; j++)
{
// 如果找到比当前最小元素更小的元素,更新 min_index
if (arr[j] < arr[min_index])
{
min_index = j;
}
}
// 将最小元素与已排序序列的末尾交换
swap(&arr[i], &arr[min_index]);
}
}
选择排序的优缺点
选择排序的优点是:
- 简单易懂,实现容易。
- 不占用额外的内存空间,是一种原地排序算法。
- 交换次数较少,最多进行 n - 1 次交换。
选择排序的缺点是:
- 时间复杂度较高,无论数据是否有序,都需要进行 O(n^2) 次比较。
- 不稳定,即相同的元素可能会改变原来的相对顺序。
总结
选择排序是一种简单直观的排序算法,它的基本思想是,每次从未排序序列中找到最小(大)元素,放到已排序序列的末尾,直到所有元素均排序完毕。选择排序的时间复杂度是 O(n^2),空间复杂度是 O(1),交换次数是 O(n),是一种不稳定的原地排序算法。选择排序适合数据规模较小的情况,如果数据规模较大,可以考虑其他更高效的排序算法。
猜你喜欢
- 2025-07-02 一文吃透ConcurrentHashMap的前世与今生
- 2025-07-02 钟表程序(C语言+SDL2)(时钟程序编写)
- 2025-07-02 教你实现高逼格Android弹幕效果(安卓弹幕助手)
- 2025-07-02 基于LockAI视觉识别模块:C++同时识别轮廓和色块
- 2025-07-02 国产教学实验箱_DSP教学实验箱_操作教程:4-4 有限冲激响应滤波器
- 2025-07-02 Android 系统核心机制binder(04)binder C++层 TestServer分析
- 2025-07-02 乐鑫esp32系列在睡眠模式蓝牙连接功耗测试,启明云端乐鑫代理商
- 2025-07-02 深度解析HashMap集合底层原理(使用hashmap集合迭代出元素的和元素存入的顺序)
- 2025-07-02 c++时间和日期(c++计算日期对应的天数)
- 2025-07-02 嵌入式开发中常用的软件工程方法有哪些?
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)