C/C++每日一练:实现选择排序

news2024/10/28 22:53:09

选择排序

        选择排序是一种简单直观的排序算法,时间复杂度为O(n^{2}),其中 n 是数组长度,不适合大数据集的排序,适合于元素较少且对性能要求不高的场景。

        选择排序的基本思想是:每次从未排序部分选择最小的元素,将其放到已排序部分的末尾。这样经过多轮操作后,整个数组会被逐步排好序。

        具体步骤如下:

  1. 初始化:将第一个元素作为已排序区,剩余部分作为未排序区。
  2. 遍历未排序区:从未排序区间找出最小的元素,记下其位置。
  3. 交换位置:将找到的最小元素与当前未排序区的第一个元素交换。
  4. 重复上述步骤:每次将已排序区的范围扩大一个元素,直到整个数组排序完成。

题目要求

        实现一个选择排序算法,用于对整数数组进行升序排序。输入是一个包含若干整数的数组,输出是排序后的数组。要求在原数组上进行排序,不借助额外的数组空间(即就地排序)。

做题思路

  1. 初始化已排序区间和未排序区间:数组已排序区间最开始为空,所有元素都在未排序区间中。
  2. 逐步扩展已排序区间:遍历数组,从未排序区间中找出最小值的下标,将其与当前未排序区间的起始元素交换。
  3. 更新边界:每次将已排序区间的范围扩大一个元素。

过程解析

        假设有一个数组 arr,长度为 n。使用变量 minIndex 记录当前未排序区间中最小值的下标。具体步骤如下:

  1. 外层循环控制已排序区间的结束位置 i(从 0 开始)。
  2. 每次将未排序区间的第一个元素设为最小值(minIndex = i)。
  3. 内层循环从 i + 1 到 n - 1,找到未排序区间的最小值的下标并更新到 minIndex。
  4. 找到最小值后,与当前未排序区间的第一个元素交换位置(如果 i 和 minIndex 不相同)。

运用到的知识点

  • 数组:数组的定义和遍历
  • 双层循环:外层循环控制排序轮数,内层循环查找未排序区间的最小值
  • 条件判断和交换操作:根据下标交换两个元素的值

示例代码

C 实现

#include <stdio.h> // 引入标准输入输出库,用于printf等函数  

// 定义选择排序函数,接收一个整型数组和数组的长度作为参数  
void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {         // 外层循环:逐步将元素放入已排序区,从第一个元素开始到倒数第二个元素  
        int minIndex = i;                     // 假设当前未排序区第一个元素为最小值,记录其下标  
        for (int j = i + 1; j < n; j++) {     // 内层循环:从当前元素的下一个元素开始,遍历未排序区  
            if (arr[j] < arr[minIndex]) {     // 如果找到比当前最小值还小的元素  
                minIndex = j;                 // 更新最小值下标为当前更小元素的下标  
            }
        }
        if (minIndex != i) {                  // 如果找到的最小值不是当前元素(即最小值下标发生了改变)  
            int temp = arr[i];                // 交换元素,将找到的最小值元素与当前元素位置互换  
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

// 定义打印数组函数,接收一个整型数组和数组的长度作为参数  
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]);     // 计算数组的长度,即数组中元素的个数  
    selectionSort(arr, n);                    // 调用选择排序函数对数组进行排序  
    printf("排序后的数组: ");                 // 打印提示信息  
    printArray(arr, n);                       // 调用打印数组函数输出排序后的数组  
    return 0;                                 // 程序正常结束,返回0  
}

C++ 实现

#include <iostream> // 引入输入输出流库,用于输入输出操作  
#include <vector>   // 引入向量库,用于使用动态数组  
  
using namespace std; // 使用标准命名空间,避免每次调用标准库时都需要加std::前缀  
  
// 定义选择排序函数,接收一个整数向量的引用作为参数,避免复制整个数组  
void selectionSort(vector<int>& arr) {  
    int n = arr.size(); // 获取数组的长度  
    for (int i = 0; i < n - 1; i++) {             // 外层循环:从第0个元素遍历到倒数第二个元素  
        int minIndex = i;                         // 假设当前未排序区的第一个元素为最小值,并记录其下标  
        for (int j = i + 1; j < n; j++) {         // 内层循环:从当前元素的下一个元素开始,遍历未排序区  
            if (arr[j] < arr[minIndex]) {         // 如果找到比当前最小值还小的元素  
                minIndex = j;                     // 更新最小值下标为当前更小元素的下标  
            }  
        }  
        if (minIndex != i) {                      // 如果找到的最小值下标不是当前元素的下标(即最小值发生了移动)  
            swap(arr[i], arr[minIndex]);          // 使用C++内置的swap函数交换两个元素的位置,将最小值放到已排序区的末尾  
        }  
    }  
}  
  
// 定义打印数组函数,接收一个整数向量的常量引用作为参数,避免修改原数组  
void printArray(const vector<int>& arr) {  
    for (int i : arr) { // 使用范围for循环遍历数组中的每个元素  
        cout << i << " "; // 打印每个元素,元素之间用空格分隔  
    }  
    cout << endl; // 打印完所有元素后换行  
}  
  
int main() 
{  
    vector<int> arr = {64, 25, 12, 22, 11}; // 定义一个整数向量并初始化  
    selectionSort(arr);                           // 调用选择排序函数对数组进行排序  
    cout << "排序后的数组: "; // 打印提示信息  
    printArray(arr);                              // 调用打印数组函数输出排序后的数组  
    return 0; // 程序正常结束,返回0  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[四轴飞行器] 遥控器操作说明

遥控器操作说明 1 A&#xff1a;无线连接信号强度&#xff1a;已连接 B&#xff1a;控制模式&#xff1a;H定高模式,T定点模式 C&#xff1a;遥控器状态&#xff1a;加锁 D&#xff1a;飞行模式&#xff1a;无头 E&#xff1a;电量显示&#xff1a;遥控器电量&#xff08;加…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息&#xff0c;得到4组数字块。1.5 遍历数字块&#xff0c;将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…

Jupyter Notebook 中使用render_notebook渲染pyecharts图像不显示的一种情况

一开始我发现自己的jupyter文件在渲染pyecharts图片时一开始可以显示&#xff0c;但后来不知道怎么的就不显示了&#xff0c;查找了很多方法&#xff0c;但是没有效果&#xff0c;都是改js渲染什么的&#xff0c;还有就是参数不对的&#xff0c;对于我来说都没什么用&#xff0…

Pytorch学习--DataLoader的使用

一、DataLoader简介 DataLoader官网 重要参数&#xff1a;画红框的参数 dataset: 作用&#xff1a;表示要加载的数据集。DataLoader通过该参数从数据集中读取数据。类型&#xff1a;Dataset&#xff0c;即PyTorch定义的Dataset类&#xff0c;用于封装数据并提供数据索引的功…

C++第八讲:STL--stack和queue的使用及模拟实现

C第八讲&#xff1a;STL--stack和queue的使用及模拟实现 1.stack的使用2.queue的使用3.栈和队列OJ题3.1题目1&#xff1a;最小栈3.2题目2&#xff1a;栈的压入、弹出序列3.3题目3&#xff1a;逆波兰表达式求值3.4题目4&#xff1a;用栈实现队列 4.栈的模拟实现5.队列的模拟实现…

BFS解决最短路问题(4)_为高尔夫比赛砍树

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 BFS解决最短路问题(4)_为高尔夫比赛砍树 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48…

LeetCode-684. 冗余连接

. - 力扣&#xff08;LeetCode&#xff09; 题目 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于…

传输层UDP

再谈端口号 端口号&#xff1a;标识了主机上进行通信的不同的应用程序 在TCP/IP 协议中我们用“源IP”"源端口号" “目的IP”“目的端口号” “协议号”五元组来标识一个通信 用netstat -n 查看 查看网络信息&#xff0c;我们有两种命令查看网络通信1.用netsta…

Python | Leetcode Python题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution:def fib(self, n: int) -> int:if n < 2:return nq [[1, 1], [1, 0]]res self.matrix_pow(q, n - 1)return res[0][0]def matrix_pow(self, a: List[List[int]], n: int) -> List[List[int]]:ret [[1, 0], [0, …

1 环境配置、创建功能包、编译、Cmake文件及package文件学习笔记

1 基本结构 放张 赵虚左老师的pdf截图 2 环境配置 //每次都需配置 . install/setup.bash//或者一次配置echo "source /path/to/your/workspace_name/install/setup.bash" >> ~/.bashrcsource ~/.bashrc3 创建功能包 ros2 pkg create 包名--build-type 构建类…

气象监测软件的程序设计

老师留了个作业&#xff0c;感觉挺有意思&#xff0c;记录一下 文章目录 气象监测软件的程序设计项目指导书&#xff08;一&#xff09;基本信息&#xff08;二&#xff09;项目目标&#xff08;三&#xff09;任务描述&#xff08;四&#xff09;指导内容任务 1&#xff1a;根…

电磁干扰(EMI)与电磁兼容性(EMC)【小登培训】

电磁干扰&#xff08;EMI&#xff09;和电磁兼容性&#xff08;EMC&#xff09;是每个产品在3C &#xff0c;CE认证过程中必不可少的测试项目&#xff1a; 一、电磁干扰&#xff08;EMI&#xff09; EMI&#xff08;Electromagnetic Interference&#xff09;是指电子设备在工作…

ARM学习(33)英飞凌(infineon)PSOC 6 板子学习

笔者来聊一下psoc62 系列板子的知识 1、PSOC62板子介绍 Psoc6-evaluationkit-062S2 与RT-Thread联合推出的一款32位的双core的板子&#xff0c;基于CortexM4以及CortexM0。 管脚兼容Arduio。板载DAP-Link&#xff0c;可以支持调试以及串口&#xff0c;无需外接2MB的Flash以及…

JavaEE初阶---文件IO总结

文章目录 1.文件初识2.java针对于文件的操作2.1文件系统的操作---file类2.2文件内容的操作---流对象的分类2.4字符流的操作》文本文件2.4.1异常的说明2.4.2第一种文件内容的读取方式2.4.3第二种读取方式2.4.4close的方法的介绍2.4.5close的使用优化操作2.4.6内容的写入 2.3字节…

数据结构与算法汇总整理篇——数组与字符串双指针与滑动窗口的联系学习及框架思考

数组 数组精髓&#xff1a;循环不变量原则 数组是存放在连续内存空间上的相同类型数据的集合&#xff0c;通过索引(下标)访问元素&#xff0c;索引从0开始 随机访问快(O(1)时间复杂度)&#xff1b;插入删除慢(需要移动元素)&#xff1b;长度固定(部分语言中可动态调整) 其存…

【CSS】边界三角形

有三角形 Unicode 字符。您可以在 SVG 中绘制三角形。但还有另一种在 Web 上绘制三角形的方法&#xff0c;只需使用 border 属性和一些 CSS 技巧即可。 想象一个具有粗边框的元素&#xff1a; .triangle {width: 200px;height: 200px;border: 10px solid black; }现在想象一下…

公园客流统计系统根据游客数量安排清洁人员

公园作为人们休闲娱乐的公共场所&#xff0c;游客流量时常处于动态变化中。而公园客流统计系统的应用&#xff0c;为依据游客数量合理安排清洁人员提供了有效途径&#xff0c;主要体现在以下几个方面。 一、精准掌握游客分布&#xff0c;按需调配清洁力量 公园客流统计系统能够…

Es可视化界面 ElasticHd

前言 在开发的过程中&#xff0c;有一个可视化界面工具&#xff0c;以及一个可执行的es相关语句的工具十分重要&#xff0c;主要有以下这些 1. Kibana‌&#xff1a;○ Kibana是Elastic官方提供的数据可视化工具&#xff0c;功能强大&#xff0c;支持多种图表类型&#xff0c…

REST APIs与微服务:关键差异

在构建基于微服务的应用程序时RESYful API和微服务这两个术语经常相伴出现。然而&#xff0c;它们指的是截然不同的东西。 了解 RESTful API 和微服务之间差异的最简单方式是这样&#xff1a; 微服务&#xff1a;它们是构成更大规模基于微服务的应用程序的单个服务和功能&…

雷池社区版OPEN API使用教程

OPEN API使用教程 新版本接口支持API Token鉴权 接口文档官方没有提供&#xff0c;有需要可以自行爬取&#xff0c;爬了几个&#xff0c;其实也很方便 使用条件 需要使用默认的 admin 用户登录才可见此功能版本需要 > 6.6.0 使用方法 1.在系统管理创建API TOKEN 2.发…