排序之选择排序(C# C++)

目录

 1  选择排序

 2  排序原理

 3  排序步骤

 4  代码示例

 4-1  C#代码示例

 4-2  C++代码示例


 1  选择排序

选择排序(Selection Sort)是一种简单直观的排序算法,它的基本思想是每一轮从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

 2  排序原理

选择排序的核心原理是通过不断地选择最小(或最大)元素并将其放置到合适的位置,逐步构建有序序列。具体来说,它会将数组分为已排序部分和未排序部分,初始时已排序部分为空,未排序部分为整个数组。每一轮排序会从未排序部分中找出最小(或最大)的元素,然后将其与未排序部分的第一个元素交换位置,这样就使得已排序部分的长度增加 1,未排序部分的长度减少 1,重复这个过程直到未排序部分为空。

 3  排序步骤

下面以升序排序为例说明选择排序的步骤:

  1. 初始状态:给定一个包含 n 个元素的数组 arr,初始时整个数组都是未排序部分。
  2. 第一轮选择
    • 从数组的第一个元素开始,遍历整个数组,找出最小的元素。
    • 记录最小元素的索引。
    • 将最小元素与数组的第一个元素交换位置。此时,数组的第一个元素已经排好序,已排序部分包含 1 个元素,未排序部分包含 n - 1 个元素。
  3. 第二轮选择
    • 从数组的第二个元素开始,遍历剩余的未排序部分,找出最小的元素。
    • 记录最小元素的索引。
    • 将最小元素与数组的第二个元素交换位置。此时,数组的前两个元素已经排好序,已排序部分包含 2 个元素,未排序部分包含 n - 2 个元素。
  4. 重复选择过程:重复上述步骤,直到未排序部分只剩下一个元素。此时,整个数组就已经排好序。

 4  代码示例

 4-1  C#代码示例
using System;namespace ConsoleApplication1
{internal class Program{private static void SelectionSort(int[] arr){if (arr == null || arr.Length < 2) return;for (int i = 0; i < arr.Length - 1; i++){int minIndex = i;for (int j = i + 1; j < arr.Length; j++)minIndex = arr[j] < arr[minIndex] ? j : minIndex;Swap(arr,i,minIndex);}}private static void Swap(int[] arr, int i, int j){if (i!= j)      {arr[i] ^= arr[j];arr[j] = arr[i] ^ arr[j];arr[i] ^= arr[j];}}public static void Main(string[] args){int[] arr = { 2, 5, 7, 9, 3, 1, 4, 6, 8 };SelectionSort(arr);foreach (var value in arr)Console.WriteLine(value);}}
}

运行结果:

 4-2  C++代码示例
#include <iostream>
#include <vector>// 交换向量中两个位置元素的函数
void Swap(std::vector<int>& arr, int i, int j) {if (i != j) {arr[i] ^= arr[j];arr[j] = arr[i] ^ arr[j];arr[i] ^= arr[j];}
}// 选择排序函数
std::vector<int> SelectionSort(std::vector<int> arr) {if (arr.size() < 2) {return arr;}for (size_t i = 0; i < arr.size() - 1; ++i) {size_t minIndex = i;for (size_t j = i + 1; j < arr.size(); ++j) {if (arr[j] < arr[minIndex]) {minIndex = j;}}Swap(arr, static_cast<int>(i), static_cast<int>(minIndex));}return arr;
}int main() {std::vector<int> arr = { 2, 5, 7, 9, 3, 1, 4, 6, 8 };arr = SelectionSort(arr);for (int value : arr) {std::cout << value << std::endl;}return 0;
}

运行结果:

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

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

相关文章

达梦 跟踪日志诊断

目录标题 参考连接**性能诊断&#xff1a;跟踪日志诊断****总结** 参考连接 性能诊断 -> 跟踪日志诊断 性能诊断&#xff1a;跟踪日志诊断 备份现有的日志配置文件 在修改文件之前&#xff0c;建议先备份原始文件&#xff0c;以防万一需要恢复。 cp /opt/dmdbms/dmdata/DA…

nodejs版本管理,使用 nvm 删除node版本,要删除 Node.js 的某个版本详细操作

要删除 Node.js 的某个版本并保持 Node Version Manager (nvm) 的管理整洁&#xff0c;可以按以下步骤操作&#xff1a; 步骤 1&#xff1a;查看已安装的 Node.js 版本 nvm ls这会列出你通过 nvm 安装的所有 Node.js 版本。输出类似于&#xff1a; -> v18.17.1v16.20…

算法与数据结构(多数元素)

题目 思路 方法一&#xff1a;哈希表 因为要求出现次数最多的元素&#xff0c;所以我们可以使用哈希映射存储每个元素及其出现的次数。每次记录出现的次数若比最大次数大&#xff0c;则替换。 方法二&#xff1a;摩尔算法 摩尔的核心算法就是对抗&#xff0c;因为存在次数多…

《open3d qt 网格采样成点云》

open3d qt 网格采样成点云 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionMeshUniformSample_triggered();//均匀采样 void MainWindow::

windows平台上 oracle简单操作手册

一 环境描述 Oracle 11g单机环境 二 基本操作 2.1 数据库的启动与停止 启动: C:\Users\Administrator>sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 星期五 7月 31 12:19:51 2020 Copyright (c) 1982, 2013, Oracle. All rights reserved. 连接到:…

mybatis mapper java.uti.Date 与 jdbcType.TIMESTAMP相差8小时

Java实体类 给类型是 Date mybatis中配置的 jdbcType“TIMESTAMP” 最后通过mapper查询出的数据&#xff0c;比数据库中一直少8个小时。网上查询以及深度学习 问答系统&#xff0c;都说是时区问题导致的。 检查了数据库连接字符串 已经添加了 asia/shanghai 采用select sysdat…

【SpringBoot3.x+】slf4j-log4j12依赖引入打印日志报错的两种解决方法

最开始引入了1.7.5版本的slf4j-log4j依赖包&#xff0c;但是控制台不报错也不显示日志 在https://mvnrepository.com/找到最新的2.0.16版本之后出现报错&#xff1a; 进入提示的slf4j网站中可以找到从2.0.0版本开始&#xff0c;slf4j-log4j已经被slf4j-reload4j取代&#xff1…

C语言交换排序之快速排序

文章目录 概要代码输出分析优缺点 概要 快速排序&#xff08;Quick Sort&#xff09;&#xff1a; 是一种非常高效的排序算法&#xff0c;基于分治法&#xff08;Divide and Conquer&#xff09;的思想。它的基本思想是通过一个"基准"元素&#xff08;pivot&#xf…

SpringMVC请求执行流程源码解析

文章目录 0.SpringMVC九大内置组件1.processRequest方法1.请求先到service方法2.然后不管是get还是post都会跳转到processRequest方法统一处理 2.doService方法3.doDispatch方法1.代码2.checkMultipart 4.核心流程 0.SpringMVC九大内置组件 1.processRequest方法 1.请求先到se…

深度学习项目--基于RNN的阿尔茨海默病诊断研究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 其实这个项目比较适合机器学习做&#xff0c;用XGBoost会更好&#xff0c;这个项目更适合RNN学习案例&#xff0c;测试集准确率达到百分之84.2&#xf…

华宇TAS应用中间件与因朵科技多款产品完成兼容互认证

在数字化浪潮澎湃向前的当下&#xff0c;信息技术的深度融合与协同发展成为推动各行业创新变革的关键力量。近日&#xff0c;华宇TAS应用中间件携手河北因朵科技有限公司&#xff0c;完成了多项核心产品的兼容互认证。 此次兼容性测试的良好表现&#xff0c;为双方的进一步深入…

麒麟操作系统-MySQL5.7.36二进制安装

1、创建MySQL虚拟用户 groupadd mysql useradd -g mysql -s /sbin/nologin -M mysql 2、创建目录 mkdir -p /data/file #创建文件目录 mkdir -p /opt/mysql #创建MySQL安装目录 mkdir -p /data/mysql/mysql3306/{data,logs} #创建MySQL数据及日志目录 3、安装MySQL5.7.36 …

算法学习笔记之贪心算法

导引&#xff08;硕鼠的交易&#xff09; 硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。 仓库有N个房间&#xff0c;第i个房间有 J[i] 磅奶酪并需要 F[i] 磅猫粮交换&#xff0c;硕鼠可以按比例来交换&#xff0c;不必交换所有的奶酪 计算硕鼠最多能得到多少磅奶酪。 输入M和…

Xcode证书密钥导入

证书干嘛用 渠道定期会给xcode证书&#xff0c;用来给ios打包用&#xff0c;证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中&#xff0c;选择系统。(选登录也行&#xff0c;反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥&#xff…

使用 Elastic APM 监控你的 C++ 应用程序

作者&#xff1a;来自 Elastic Haidar Braimaanie 在本文中&#xff0c;我们将使用 Opentelemetry CPP 客户端来监控 Elastic APM 中的 C 应用程序。 介绍 开发人员、SRE 和 DevOps 专业人员面临的主要挑战之一是缺乏能够为他们提供应用程序堆栈可见性的综合工具。市场上的许多…

前端骨架怎样实现

前端骨架屏&#xff08;Skeleton Screen&#xff09;是一种优化页面加载体验的技术&#xff0c;通常在内容加载时展示一个简易的占位符&#xff0c;避免用户看到空白页面。骨架屏通过展示页面结构的骨架样式&#xff0c;让用户有页面正在加载的感觉&#xff0c;而不是等待内容加…

团结引擎 Shader Graph:解锁图形创作新高度

Shader Graph 始终致力于为开发者提供直观且高效的着色器构建工具&#xff0c;持续推动图形渲染创作的创新与便捷。在团结引擎1.4.0中&#xff0c;Shader Graph 迎来了重大更新&#xff0c;新增多项强大功能并优化操作体验&#xff0c;助力开发者更轻松地实现高质量的渲染效果与…

微信小程序地图标记点,安卓手机一次性渲染不出来的问题

问题描述&#xff1a; 如果微信小程序端&#xff0c;渲染的标记物太多&#xff0c;安卓手机存在标记物不显示的问题&#xff0c;原因初步判断是地图还没有渲染完&#xff0c;标记物数据已经加载完了&#xff0c;导致没有在地图上显示。 解决办法&#xff1a; 使用map组件的b…

AI前端开发的崛起与ScriptEcho的助力

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术飞速发展&#xff0c;深刻地改变着软件开发的格局。尤其是在前端开发领域&#xff0c;AI的应用越来越广泛&#xff0c;催生了对AI写代码工具的需求激增&#xff0c;也显著提升了相关人才的市场价值。然而&#xff0c;…

安装并配置 MySQL

MySQL 是世界上最流行的开源关系型数据库管理系统之一&#xff0c;因其高性能、可靠性和易用性而被广泛应用于各种规模的企业级应用中。本文将详细介绍如何在不同的操作系统上安装和配置 MySQL&#xff0c;帮助你快速搭建起一个功能完善的数据库环境。 选择适合你的安装方式 …