CSP-J 算法基础 选择排序

devtools/2024/10/7 21:42:57/

文章目录

  • 前言
  • 选择排序
    • 选择排序的过程
    • 最终结果
  • 编程实现选择排序
  • 总结


前言

选择排序(Selection Sort)是一种简单直观的排序算法,其工作原理是每次从未排序的部分中选出最小(或最大)的元素,将其与当前的第一个元素交换位置,然后缩小未排序部分的范围。每一轮都会找到剩余部分中的最小元素,逐步构建一个有序的数组。选择排序的时间复杂度为 O(n²),不适合大数据集,但由于其实现简单,通常被用于教学和理解基本排序算法的入门。


选择排序

选择排序(Selection Sort)是一种简单的排序算法,其基本思想是每次从待排序的部分选择一个最小(或最大)元素,将其放到已排序部分的末尾。它通过不断选择剩余部分的最小元素,并将其放到当前位置,直到整个数组排序完成。

选择排序的过程

假设我们有一个数组 [64, 25, 12, 22, 11],使用选择排序对它进行升序排序。

  1. 初始数组
    [64, 25, 12, 22, 11]

    • 初始时整个数组为待排序部分。
  2. 第1轮

    • 寻找最小值:在 [64, 25, 12, 22, 11] 中,最小的元素是 11
    • 交换位置:将 11 与第一个元素 64 交换位置。
      [11, 25, 12, 22, 64]

    第1轮结果11 是已排序部分的第一个元素。

  3. 第2轮

    • 寻找最小值:在 [25, 12, 22, 64] 中,最小的元素是 12
    • 交换位置:将 12 与第一个元素 25 交换位置。
      [11, 12, 25, 22, 64]

    第2轮结果1112 是已排序部分。

  4. 第3轮

    • 寻找最小值:在 [25, 22, 64] 中,最小的元素是 22
    • 交换位置:将 22 与第一个元素 25 交换位置。
      [11, 12, 22, 25, 64]

    第3轮结果11, 12, 22 是已排序部分。

  5. 第4轮

    • 寻找最小值:在 [25, 64] 中,最小的元素是 25,无需交换。
    • 数组保持不变
      [11, 12, 22, 25, 64]

    第4轮结果11, 12, 22, 25 是已排序部分。

  6. 第5轮

    • 剩下的最后一个元素 64 已经是排序好的,不需要再进行操作。

    第5轮结果:数组已完全排序为 [11, 12, 22, 25, 64]

最终结果

经过选择排序,数组 [64, 25, 12, 22, 11] 被排序为 [11, 12, 22, 25, 64]

选择排序总结:
选择排序通过不断选择未排序部分的最小元素,并将其放到已排序部分的末尾,逐步构建出有序数组。尽管选择排序的时间复杂度为 O(n²),它在小规模数据集或对性能要求不高的场景下具有一定的实用性。其简单易实现的特性使其成为学习排序算法的基础,同时也为理解更复杂的排序算法提供了良好的起点。

编程实现选择排序

  1. 我们需要找到未排序序列中的最小值,然后记录其index
  2. 然后对最小值与末尾值进行交换
#include <stdio.h>// 选择排序函数(带调试信息)
void selectionSort(int arr[], int n) {int i, j, minIdx, temp;// 逐步将最小元素移到已排序部分for (i = 0; i < n - 1; i++) {minIdx = i; // 假设当前元素为最小值printf("\n第 %d 轮:\n", i + 1);printf("初始数组: ");for (int k = 0; k < n; k++) {printf("%d ", arr[k]);}printf("\n");// 找到从 i 到 n-1 范围内的最小值for (j = i + 1; j < n; j++) {if (arr[j] < arr[minIdx]) {minIdx = j; // 更新最小值的索引}}printf("找到的最小值是 %d(在索引 %d)\n", arr[minIdx], minIdx);// 交换最小值和当前位置的值if (minIdx != i) {temp = arr[minIdx];arr[minIdx] = arr[i];arr[i] = temp;printf("交换 %d 和 %d\n", arr[i], arr[minIdx]);} else {printf("当前元素已是最小值,无需交换\n");}// 输出交换后的数组状态printf("交换后的数组: ");for (int k = 0; k < n; k++) {printf("%d ", arr[k]);}printf("\n");}
}// 打印数组函数
void printArray(int arr[], int n) {for (int i = 0; i < n; 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("\n排序后的数组: ");printArray(arr, n);return 0;
}

总结

选择排序通过每轮选择未排序部分中的最小元素并将其放到已排序部分末尾的方式完成排序。虽然选择排序的时间复杂度较高,在处理大数据集时效率不佳,但由于它的结构简单、便于实现,仍然是学习排序算法的基础之一。选择排序的每次比较和交换步骤都非常清晰,是理解其他复杂排序算法的有力工具。对于小数据集或对性能要求不高的场景,选择排序依然可以提供有效的解决方案。


http://www.ppmy.cn/devtools/110361.html

相关文章

【Linux 从基础到进阶】自动化备份与恢复策略

自动化备份与恢复策略 在 Linux 运维中,数据的安全性至关重要,自动化备份与恢复策略是保障系统和数据安全的核心环节。无论是系统配置文件、用户数据、数据库还是应用程序日志,备份和恢复都能为系统灾难恢复、数据丢失等突发情况提供可靠的解决方案。 本文将介绍如何在 Ce…

MySQL聚合统计:性能优化与高级应用

MySQL聚合统计&#xff1a;性能优化与高级应用 目录 MySQL聚合统计&#xff1a;性能优化与高级应用 引言 一、聚合函数的探索 1.计数与总计 示例&#xff1a; 2.平均值与中位数 示例&#xff1a; 3.最大值与最小值 示例&#xff1a; 二、数据分组与对比 1.分组统计 …

【EulerOS】华为欧拉服务器操作系统安装与使用教程_欧拉操作系统安装教程

2、设置安装程序语言 选择“中文”&#xff0c;继续下一步操作。 3、进入安装界面&#xff0c;设置安装参数配置信息。 &#xff08;1&#xff09;软件选择 选择“带GUI的服务器”&#xff0c;点击“完成”&#xff0c;返回主安装界面。 &#xff08;2&#xff09;选择要安…

天气预报爬虫

一、获取天气接口 主要通过nowapi注册用户之后&#xff0c;进入相应的接口&#xff0c;进行抓取报文。 二、wireshark抓取报文&#xff0c;解析cjson格式 Http的交互过程 1.建立TCP连接 2.发送HTTP请求报文 3.回复HTTP响应报文 4.断开TCP连接 CJSON的使用办法 1. JSON…

【自然语言处理】实验二:基于NLP工具的词性标注实验

目录 前言 1.词性标注模块 1.1 导入中文文本 1.2 给出字典映射 1.3 cut词性标注 1.4 lcut词性标注 2.统计人名次数 2.1 精确模式 2.2 统计存储单词 2.3 生成文本输出 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你…

49. 丑数

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9849.%20%E4%B8%91%E6%95%B0/README.md 面试题 49. 丑数 题目描述 我们把只包含质因子 2、3 和 5 的数称作丑数&#xff08;Ugly Number&#xff09;。…

qtdraw-使用qt绘图之开源源码学习

1. 资源介绍 功能&#xff1a;使用qt在画板上绘制各种形状&#xff0c;并保持绘制内容到xml文件中。 项目源码&#xff1a;https://github.com/egan2015/qdraw 软件界面&#xff1a; 1.1 支持shape 6种 1.2 支持的功能 6种&#xff0c;分别是对绘制的图形进行撤销undo&…

8K回报率10枚自定义按键,PC游戏丝滑操作,雷柏VT1 Pro MAX鼠标体验

现在喜欢玩PC游戏的朋友越来越多&#xff0c;《黑神话&#xff1a;悟空》等3A游戏也吸引到了更多的新玩家&#xff0c;想要完美运行此类游戏&#xff0c;不仅需要高性能的电脑硬件&#xff0c;还需要操控精准、反应敏捷的鼠标、键盘等外设。前端时间雷柏推出了VT1系列鼠标&…