直接选择排序——C语言实现

2023-05-16

上期我们讲了堆排序,堆排序是选择排序的一种,本期我们讲述一下直接选择排序,按道理应该是先讲直接选择排序的。直接选择排序效率极低,只是了解一下,实际不推荐使用。
🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥

🥇一、直接选择排序思想

⛳直接选择排序就是遍历整个数组,每遍历一遍的目的是找出该数组中的最大数和最小数对应的下标,然后将最小数和数组的第一个数进行交换,最大数和数组的最后一个数进行交换,然后缩小范围再次遍历。(已排好的最大数和最小数不再参与后续的遍历)

🎸图解分析:
在这里插入图片描述

🎻上图为一次遍历找出最大值下标和最小值下标的过程,利用begin和end控制for循环的区间,直到begin和end相遇时,就不再遍历。

🥈二、代码实现

#include<iostream>
using namespace std;

//打印函数
void Print(int* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
}

//交换函数
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

//直接选择排序
void SelectSort(int* arr,int n)
{
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
	//max和min分别代表最大值和最小值的下标
		int max = begin;
		int min = begin;
		for (int i = begin; i <= end; i++)
		{
			if (arr[i] < arr[min])
			{
				min = i;
			}
			if (arr[i] > arr[max])
			{
				max = i;
			}
		}
		Swap(&arr[begin], &arr[min]);
		//如果begin和maxindex重合了,必须调整一下maxindex
		if (begin == max)
		{
			max = min;
		}
		Swap(&arr[end], &arr[max]);
		begin++;
		end--;
	}
}

void test()
{
	int arr[] = { 11,5,8,6,7,3,0,-1,-2 };
	int n = sizeof(arr) / sizeof(arr[0]);
	SelectSort(arr, n);
	Print(arr, n);
}

int main()
{
	test();
	return 0;
}

🥉三、特殊情况处理

💉从上面的代码可以看到,在交换函数之前,如果begin和max正好重合了,那么久会出现在arr[begin]和arr[min]交换后,下一步要和arr[end]进行交换的arr[max]被改变了,被改变成了现在的arr[min],而实际上要和arr[end]进行交换的数的下标变成了min。所以要对max进行调整,即max=min。

当然这和代码顺序有关,如果先

Swap(&arr[end], &arr[maxindex]);

Swap(&arr[begin], &arr[minindex]);

🌴那么需要调整的情况就是当end和min重合时,要对min进行调整,即min=max。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

直接选择排序——C语言实现 的相关文章

  • 【转载】sprintf的实现

    原文链接 我们已经知道printf 是控制台程序中最常用的函数 xff0c 作用是输入的字符 数字等信息拼成完整的句子并且输出到标准输出设备 显示器 控制台等 xff0c sprintf 函数命名与printf 函数及其相似又有什么作用呢
  • 【程序员读论文】题外篇:怎么读论文

    文章目录 1 如何高效读论文 xff1f 痛苦选择顺序笔记小结讨论 2 如何有针对地高效地阅读一篇学术论文 xff1f 3 一文教你如何快速高效阅读Paper xff08 硕士生版 xff09 前言Paper从哪来Paper怎么读Paper
  • Linux中C语言标准库glibc源码下载

    在这篇文章理清gcc libc glibc libc 43 43 libstdc 43 43 的关系 xff0c 我们大概理解了libc xff0c glibc之间的一些关系 下面我们就开了解一些Linux中C语言标准库glibc源码 在这
  • 50个常用SQL语句

    50个常用SQL语句 Student S Sname Sage Ssex 学生表 S 学号 xff0c 主键 Course C Cname T 课程表 C 课程号 xff0c 主键 SC S C score 成绩表 Teacher T Tn
  • 一文搞懂交叉编译,Windows和Linux的交叉编译

    文章目录 什么是交叉编译为什么要交叉编译工具链的种类 我们应该怎样建立交叉编译环境在Windows下交叉编译和调试树莓派软件一 Windows下编译树莓派程序二 用WSL来编译树莓派程序三 通过gdbserver远程调试 基于 MinGW
  • endnote 文献保留前三个作者

    1 问题描述 xff1a endnote使用GBT7714文献格式 xff0c 显示文献的全部作者 2 想要达到的效果 xff1a 最多显示三个作者 3 解决方法 xff1a 还不知道怎么弄 xff0c 看看以后再来补充 xff0c 心情烦
  • RTK_LIB 源码、可执行文件、rtkget、观测文件、星历文件(精密星历、广播星历)、精密钟差文件介绍

    1 RTK LIB开源程序下载 xff1a 点开rtklib链接 xff1a 下载最新版本的可执行文件和程序源码 2 GNSS数据处理需要的文件 2 1 伪距定位 xff1a spp 观测数据 xff08 0 xff09 导航星历 广播星历
  • RTKLIB ppp rtk_post

    1 实时ppp xff1a IGS MGEX数据处理中心的播发的实时轨道钟差产品 xff0c 结合广播星历 xff0c 实现实时定位 2 事后的 xff08 近似实时 xff09 xff1a 下载精密星历 钟差产品 xff0c 结合其他的精
  • vscode查看代码更新历史

    开源代码推出新版本后 xff0c 如何查看代码更改信息 1 首先打开vscode xff0c 点击左侧的插件管理器 xff0c 进入插件面板 xff0c 搜索Git Graph并安装 2 点击下图图标 xff0c 即可进入Git Graph
  • git更新代码

    一 git一般有很多分支 xff0c 我们clone到本地的时候一般都是master分支 xff0c 那么如何切换到其他分支呢 xff1f 主要命令如下 xff1a 1 查看本地分支文件信息 xff0c 确保更新时不产生冲突 span cl
  • char类型数组

    字符数组 xff08 一维 二维 xff09 字符数组是数组元素为char类型的一种数组 凡是适合数组的定义和赋值 xff0c 也都适合于字符数组 由于C语言没有提供字符串类型 xff0c 字符串一般用一维字符数组来存放 xff0c 而二维
  • ubuntu18.04 安装腾讯会议

    腾讯会议现在以及上线了Linux版本 xff0c 可以直接在腾讯会议官网下载linux 版本 xff0c 在官网点击免费下载 xff0c 可以直接下载Linux版本 腾讯会议下载链接 选择Linux版本 xff0c x86 64版本 xff
  • 2.树莓派系统备份

    树莓派使用SD卡来装载系统 xff0c 如果SD卡丢失或者损坏 xff0c 那么树莓派上的数据都会丢失 xff0c 所以一定要备份好SD卡 这篇文章可以帮你备份你的树莓派系统 主要内容为备份SD卡 xff0c 制作树莓派系统镜像以及在需要的
  • ic_gvins编译及环境配置问题解决

    RTK VIO松组合 对惯导精度要求较高 1 环境配置和编译 安装依赖项 span class token comment gcc 8 span span class token function sudo span span class
  • xrdp session: Login failed for display 0 树莓派 Linux

    可以通过其他方式例如ssh或者外接显示器来cat var log xrdp log查看错误日志 xff0c 我的错误日志显示为密码错误 xrdp的登录密码和账户就是你的系统用户名和密码 xff0c 不是另外的 这里我填的账户是pi xff0
  • EVO画图设置

    一 绘图设置 1 更改背景色和网格 span class token comment 白色网格 span evo config span class token builtin class name set span plot seabor
  • GINS_OB环境配置

    1 程序简介 武大开源GNSS INS松组合IMU预积分有考虑地球自传和不考虑两种形式可以灵活设置GNSS中断时间IMU可以和里程计进行融合 2 环境配置 span class token comment gcc 8 g 43 43 8 s
  • OB_GINS程序框架

    1 程序运行 span class token builtin class name cd span OB GINS span class token comment 编译好的可执行文件 xff1a bin ob gins xff0c 参数
  • Shell中的参数(位置和特殊)

    我们先来说一下 Shell 位置参数是怎么回事 运行 Shell 脚本文件时我们可以给它传递一些参数 xff0c 这些参数在脚本文件内部可以使用 n的形式来接收 xff0c 例如 xff0c 1 表示第一个参数 xff0c 2 表示第二个参
  • Ubuntu18.04安装ROS Melodic:ROS初始化(rosdep init)问题的解决办法

    这两天按照官方教程安装时http wiki ros org cn melodic Installation Ubuntu xff0c 在初始化这一步遇到了如下问题 xff1a sudo rosdep init ERROR cannot do

随机推荐