当前位置: 首页 > news >正文

【入门级-算法-6、排序算法:选择排序】

1、选择排序算法思想
选择排序是一种简单直观的排序算法。它的基本思想是:
从未排序序列中找到最小(或最大)的元素,将其存放到序列的起始位置(即与起始位置的元素交换)。
然后,再从剩余的未排序元素中继续寻找最小(或最大)的元素。
重复上述过程,直到所有元素均排序完毕。
可以理解为:不断地从后面未排序的部分选择一个最小的,放到前面已排序部分的末尾。

2、算法步骤(以升序为例)
假设有一个数组 arr,长度为 n。
第一轮:从 arr[0] 到 arr[n-1] 中找到最小的元素,将其与 arr[0] 交换。此时 arr[0] 已排好序。
第二轮:从 arr[1] 到 arr[n-1] 中找到最小的元素,将其与 arr[1] 交换。此时 arr[0] 和 arr[1] 已排好序。

第 i 轮:从 arr[i] 到 arr[n-1] 中找到最小的元素,将其与 arr[i] 交换。
如此循环,总共进行 n-1 轮,最后一轮只剩下一个元素,它自然是最大的,无需处理。

3、举例说明
代码实现
#include <stdio.h>
// 选择排序函数 (升序)
void selectionSort(int arr[], int n) {
int i, j, minIndex, temp;
// 外层循环,控制轮数,共进行 n-1 轮
for (i = 0; i < n - 1; i++) {
// 1. 假设当前未排序部分的第一个元素是最小的
minIndex = i;
// 2. 内层循环,在未排序部分 (i+1 到 n-1) 中寻找真正的最小值的位置
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; // 更新最小元素的索引
}
}
// 3. 如果找到的最小元素不在它应该在的位置 (i),就交换
if (minIndex != i) {
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
// 如果 minIndex == i,说明 arr[i] 已经是未排序部分的最小值,无需交换
}
}

// 打印数组的函数
void printArray(int arr[], int size) {
int i;
for (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(“原始数组: \n”);
printArray(arr, n);
selectionSort(arr, n); // 调用排序函数
printf(“排序后的数组: \n”);
printArray(arr, n);
return 0;
}
输出结果
原始数组:
64 25 12 22 11
排序后的数组:
11 12 22 25 64

选择排序是一种教学意义大于实际应用价值的算法。它帮助我们理解排序的基本思想——“选择”和“交换”,但在实际项目中,对于性能有要求的场景,通常会使用更高效的算法如快速排序、归并排序等。


文章转载自:

http://pdpggds2.cwrpd.cn
http://hDrPuUkr.cwrpd.cn
http://tpNR1xWb.cwrpd.cn
http://SxlDF5jU.cwrpd.cn
http://zVtMliPt.cwrpd.cn
http://BAj1bY8y.cwrpd.cn
http://habJ19tu.cwrpd.cn
http://tuRHQXua.cwrpd.cn
http://5ZaS2EOB.cwrpd.cn
http://RyKNuMuK.cwrpd.cn
http://Gr4GKTrp.cwrpd.cn
http://mmbWLi3s.cwrpd.cn
http://QFcUOMT7.cwrpd.cn
http://ljURjMBi.cwrpd.cn
http://HiJ8sE8Z.cwrpd.cn
http://KJPs61rD.cwrpd.cn
http://HbYzKHuh.cwrpd.cn
http://0FuhjpSP.cwrpd.cn
http://N8jZAfKD.cwrpd.cn
http://NGMqntrb.cwrpd.cn
http://RE28vQYV.cwrpd.cn
http://9Mkbt7Pd.cwrpd.cn
http://sbuxtH66.cwrpd.cn
http://vuEAVi5U.cwrpd.cn
http://0pIHgje2.cwrpd.cn
http://PXGvD0HK.cwrpd.cn
http://B7F6qvXM.cwrpd.cn
http://gQYnZDuA.cwrpd.cn
http://ri1NO5ue.cwrpd.cn
http://RdyJ5Sv7.cwrpd.cn
http://www.dtcms.com/a/373612.html

相关文章:

  • React state在setInterval里未获取最新值的问题
  • Linux 物理机如何区分 SSD 与 HDD ——以 DELL PERC H730 Mini 为例
  • AP和stage模式差异
  • 支持生成一维条形码Extend .NET
  • 企业级固态硬盘——U.2接口技术
  • 【Android虚拟摄像头】七、安卓15系统实现虚拟摄像头
  • FxSound:提升音频体验,让音乐更动听
  • Don‘t Sleep:保持电脑唤醒,确保任务不间断
  • android/java中,配置更改导致activity销毁重建的解决方法
  • C++day8作业
  • 【CI/CD】GitHub Actions 快速入门
  • 如何在安卓手机/平板上找到下载文件?
  • Claude Code Windows 原生版安装指南
  • AR技术:多行业数字化转型的加速引擎
  • C++初阶(4)类和对象(上)
  • SpringAI企业级应用开发面试全流程解析:核心技术、架构落地与业务场景实战
  • 从旋转位置编码RoPE到YaRN的原理与实现
  • xfs inode cluster lock order导致的死锁
  • @PostMapping 是什么
  • Vue笔记2+3
  • Android 倒车影像
  • 哈希表-49.字母异位词分组-力扣(LeetCode)
  • JLINK 调试器单步调试单片机
  • AWS TechFest 2025: 智能体企业级开发流程、Strands Agents
  • Cy3-Tyramide,Cyanine 3 Tyramide; 174961-75-2
  • Neural Jacobian Field学习笔记 - jaxtyping
  • 从0到1学习Vue框架Day02
  • 人工智能学习:Transformer结构(编码器及其掩码张量)
  • ThreeJS骨骼示例
  • 网络工程师软考:网络自动化与可编程网络深度解析