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

选择排序

        选择排序是一种简单直观的排序算法,时间复杂度为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.mzph.cn/pingmian/59560.shtml

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

相关文章

Java8新特性/java

1.lambda表达式 区别于js的箭头函数&#xff0c;python、cpp的lambda表达式&#xff0c;java8的lambda是一个匿名函数&#xff0c;java8运行把函数作为参数传递进方法中。 语法格式 (parameters) -> expression 或 (parameters...) ->{ statements; }实战 替代匿名内部类…

《现代网络技术》读书笔记:SDN数据平面和OpenFlow

本文部分内容来源于《现代网络技术&#xff1a;SDN,NFV,QoE、物联网和云计算&#xff1a;SDN,NFV,QoE,IoT,andcloud》 SDN数据平面 SDN 数据平面也称为基础设施层&#xff0c;而在ITU-T的Y3300标准中则称为资源层&#xff0c;它是网络转发设备根据 SDN控制平面的决策来执行数据…

linux centos 安装redis

安装 wget https://download.redis.io/releases/redis-7.4.0.tar.gz解压redis-7.4.0.tar.gz文件 tar -zxvf redis-7.4.0.tar.gz进入redis安装目录 cd redis-7.4.0make时报错&#xff0c;因为需要安装gcc&#xff0c;gcc安装需要联网安装 修改端口 编辑文件用vi。nano命令cen…

面向对象技术简述(含设计模式)

6.9.2 面向对象技术 面向对象 对象 分类 继承 通过消息的通信 面向对象 对象 分类 继承 通过消息的通信 面向对象对象分类继承通过消息的通信其中包括&#xff1a; 对象 运行的实体&#xff1b;既包含属性/数据&#xff0c;又包含方法/行为/操作数据的函数&#xff1b;…

yakit中的规则详细解释

官方文档 序列前置知识之高级配置 | Yak Program Language 本文章多以编写yaml模版的视角来解释 规则一览 匹配器 在编写yaml中会使用到这里两个东西 点击添加会在返回包的右下角出现匹配器 上面有三个过滤器模式&#xff0c;官方解释 丢弃&#xff1a;丢弃模式会在符合匹配…

算法每日双题精讲——双指针(移动零,复写零)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…

【SpringCloud】Kafka消息中间件

Kafka Kafka消息中间件对比&#xff1a;kafka介绍安装教程&#xff1a;配置以及启动顺序&#xff1a; Kafka整合微服务初级入门测试&#xff1a; Kafka整合SpringBoot①导入spring-kafka依赖信息②消息生产者③消息消费者Postman测试 Kafka 消息中间件对比&#xff1a; 消息中…

ViT模型复现项目实战

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

16通道AD采集方案,基于复旦微ARM + FPGA国产SoC处理器平台

测试数据汇总 表 1 本文带来的是基于复旦微FMQL20S400M四核ARM Cortex-A7(PS端) + FPGA可编程逻辑资源(PL端)异构多核SoC处理器设计的全国产工业评估板的AD采集案例。本次案例演示的开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit PL端开发环境:P…

【Python爬虫实战】DrissionPage 与 ChromiumPage:高效网页自动化与数据抓取的双利器

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、DrissionPage简介 &#xff08;一&#xff09;特点 &#xff08;二&#xff09;安装 &#xff08;三…

R7:糖尿病预测模型优化探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、实验目的&#xff1a; 探索本案例是否还有进一步优化的空间 二、实验环境&#xff1a; 语言环境&#xff1a;python 3.8编译器&#xff1a;Jupyter notebo…

HANDLINK ISS-7000v2 网关 login_handler.cgi 未授权RCE漏洞复现

0x01 产品简介 瀚霖科技股份有限公司ISS-7000 v2网络网关服务器是台高性能的网关,提供各类酒店网络认证计费的完整解决方案。由于智慧手机与平板电脑日渐普及,人们工作之时开始使用随身携带的设备,因此无线网络也成为网络使用者基本服务的项目。ISS-7000 v2可登录300至1000…

RK3576 LINUX RKNN SDK 测试

安装Conda工具 安装 Miniforge Conda wget -c https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh chmod 777 Miniforge3-Linux-x86_64.sh bash Miniforge3-Linux-x86_64.shsource ~/miniforge3/bin/activate # Miniforge 安装的…

深入学习指针(5)!!!!!!!!!!!!!!!

文章目录 1.回调函数是什么&#xff1f;2.qsort使用举例2.1使用qsort函数排序整形数据2.2使用sqort排序结构数据 3.qsort函数的模拟实现 1.回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递…

天锐绿盾加密软件与Ping32数据安全防护对比,为企业提供坚实的保障

在当今信息化时代&#xff0c;数据安全已成为企业不可忽视的重要议题。天锐绿盾加密软件与Ping32作为两款备受关注的数据安全解决方案&#xff0c;各自以其卓越的功能和优势&#xff0c;为企业数据安全提供了坚实的保障。 Ping32&#xff0c;同样以其出色的数据加密和防泄密功能…

支持向量机相关证明 解的稀疏性

主要涉及拉格朗日乘子法&#xff0c;对偶问题求解

求职经验分享

更多详情&#xff1a;爱米的前端小笔记&#xff0c;更多前端内容&#xff0c;等你来看&#xff01;这些都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们的支持才是我不断更新的动力&#xff01;找…

基于Dpabi和spm12的脑脊液(csf)分割和提取笔记

一、前言 脑脊液&#xff08;csf&#xff09;一直被认为与新陈代谢有重要关联&#xff0c;其为许多神经科学研究提供重要价值&#xff0c;从fMRI图像中提取脑脊液信号可用于多种神经系统疾病的诊断。特别是自2019年Science上那篇著名的csf-BOLD文章发表后&#xff0c;大家都试图…

力扣:94--中序遍历二叉树

树 – 二叉树 完全二叉树&#xff1a; 完全二叉树可以用数组完美匹配位置&#xff08;先序存储&#xff1a;根左右&#xff09;&#xff0c; 推论一 &#xff1a; 位置为k的节点&#xff0c;左孩子&#xff1a;2*k 1 &#xff0c;右孩子 &#xff1a; 2 * &#xff08;k 1&…

SQL 常用语句

目录 我的测试环境 学习文档 进入数据库 基础通关测验 语句-- 查 展示数据库&#xff1b; 进入某个数据库&#xff1b; 展示表&#xff1a; 展示某个表 desc 查询整个表&#xff1a; 查询特定列&#xff1a; 范围查询 等于特定值 不等于 介于 特定字符查询 Li…