【十大排序算法】----选择排序(详细图解分析+实现,小白一看就会)

news2024/11/15 21:53:40


目录

一:选择排序——原理

二:选择排序——分析

三:选择排序——实现

四:选择排序——优化

五:选择排序——效率


一:选择排序——原理

        选择排序的原理:通过遍历数组,选出该数组中较大的或者较小的,放在数组的起始位置,当遍历完整个数组时排序完成。

二:选择排序——分析

选择排序的核心就是:多趟选择

若以升序(从小到大)排序为例,假若有N个数。

  • 第一趟遍历的目的是找到整个序列中最小的值,找到之后将其与第一个数(动图中的第0个位置)交换,这样一来,在整个数组中第一个数就是最小的。
  • 第二趟遍历:目的是找到整个序列中次小的值,也就是(动图中第0个位置上的数不在变动,在剩下的 N-1 个数中选出最小的),找到之后将其与剩下的 N-1 个数的第一个数(动图中的第1个位置)交换,这样一来,在整个数组中第一个数(第0位置)就是最小的,第二个数(第1位置)就是次小的
  • ......

当经过 N-1 趟的遍历交换之后,该序列就实现的从小到大的排列了。

 动图如下:  

三:选择排序——实现

选择排序代码实现如下  

#include<stdio.h>

void SelectSort1(int* a, int n)            // 传的参数是 整个数组 和 此数组的大小
{
	int begin = 0;
	while (begin < n)                       // 决定所遍历的趟数
	{
		int mini = begin;
		for (int i = begin; i < n; i++)     // 从begin位置开始遍历
		{
			if (a[mini] > a[i])            // 找到较小的值,标记一下
			{
				mini = i;
			}
		}
		// 交换较小的值                     // 遍历一趟之后,将较小的值与 ”第一个数“ 进行交换
		int tem = a[mini];
		a[mini] = a[begin];
		a[begin] = tem;

		begin++;                   // 决定下一次所遍历的起始位置:(第一趟是0,第二趟为1,....)
	}
}

int main()
{
	int a[] = { 38,45,22,29,13,24,42 };
	int sz = sizeof(a) / sizeof(a[0]);         // 获取数组大小

	for (int i = 0; i < n; i++)                // 打印排序前的数组
    {
	    printf("%d ", a[i]);
    }
    printf("\n");
	
	SelectSort1(a, sz);                        // 实现选择排序
	
    for (int i = 0; i < n; i++)                // 打印排序后的数组
    {
    	printf("%d ", a[i]);
    }
    printf("\n");
}

四:选择排序——优化

        在选择排序中,我们是可以将其优化的,即可以一趟选出两个值,一个最大值一个最小值,然后将其放在序列开头和末尾,这样可以使选择排序的效率快一倍。

选择排序代码优化实现如下 

#include<stdio.h>

// 选择排序(优化)
void SelectSort(int* a, int n)
{
	int begin = 0, end = n - 1;            // begin标记第0位置,end标记最后一个数的位置
	while (begin < end)                    // 决定所遍历的次数
	{
		int maxi = begin;                  // 较大数---maxi变量标记
		int mini = begin;                  // 较小数---mini变量标记
		
		for (int i = begin; i <= end; i++)    // 在 [begin,end] 这一区间进行遍历
		{
			if (a[i] > a[maxi])            // 遍历的数较大,maxi进行标记
			{
				maxi = i;
			}
			if (a[i] < a[mini])            // 遍历的数较小,mini进行标记
			{
				mini = i;
			}
		}
		Swap(&a[begin], &a[mini]);        // 较小的数与 ”第一个数“ 交换,把较小的数放到 ”第一个位置“
		if (begin == maxi)                // 若 ”第一个位置“ 是较大数的位置,防止这个位置被上一个交换所 ”赶跑“
		{
			maxi = mini;
		}
		Swap(&a[end], &a[maxi]);        // 较大的数与 ”最后一个数“ 交换,把较大的数放到 ”最后一个位置“ 上
		++begin;                        // 决定下一次遍历的区间
		--end;
	}

}


int main()
{
	int a[] = { 38,45,22,29,13,24,42 };
	int sz = sizeof(a) / sizeof(a[0]);         // 获取数组大小

	for (int i = 0; i < n; i++)                // 打印排序前的数组
    {
	    printf("%d ", a[i]);
    }
    printf("\n");
	
	SelectSort(a, sz);                        // 实现选择排序
	
    for (int i = 0; i < n; i++)                // 打印排序后的数组
    {
    	printf("%d ", a[i]);
    }
    printf("\n");
}

        时刻谨记:当一个数已经知道其是 最大/最小 ,并已经将其进行交换之后,那么这个位置是万万不可变动的。

五:选择排序——效率

时间复杂度:O(N^2)

空间复杂度:O(1)

选择排序是不稳定的排序。

选择排序是最简单的排序之一,最大的优点就是好理解,不过因为其效率低下,所以在一般情况下不使用。


        以上的内容若是对大家起到帮助的话,大家可以动动小手点赞,评论+收藏。大家的支持就是我进步路上的最大动力! 

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

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

相关文章

6---Linux下版本控制器Git的知识点

一、Linux之父与Git的故事&#xff1a; Linux之父叫做“Linus Torvalds”&#xff0c;我们简称为雷纳斯。Linux是开源项目&#xff0c;所以在Linux的早期开发中&#xff0c;许多世界各地的能力各异的程序员都参与到Linux的项目开发中。那时&#xff0c;雷纳斯每天都会收到许许…

在浏览器执行js脚本的两种方式

fetch请求get 在浏览器执行http请求,可以使用fetch函数; fetch(“url”).then(response => response.text()) .then(data => console.log(JSON.parse(data)[‘status’])) .catch(error => console.error(error)) 直接返回json数据: fetch(“url”).then(response…

如何进行事务处理

1、问题背景 在数据库存储系统中&#xff0c;事务处理是一种保证多个数据库操作作为单个逻辑单元执行的技术。事务处理可以确保数据的一致性、完整性和隔离性。 在使用 Google Cloud Datastore 时&#xff0c;可以使用 datastore.transaction() 函数来进行事务处理。datastor…

ubuntu在conda环境中使用 pip install -r requirements.txt但是没有安装在虚拟环境中

whereis pip pip listubuntu在conda环境中使用pip install lpips0.1.3 但是安装在了这里 Requirement already satisfied: lpips0.1.3 in /home/uriky/anaconda3/lib/python3.11/site-packages (0.1.3) 就会出现黄色波浪&#xff0c;未在虚拟环境中安装包 解决办法1&#xff1…

在云服务器上运行StyleGAN3生成伪样本

首先是传入数据&#xff0c;这里我们不做赘述。 对于数据格式的裁剪&#xff0c;可以通过以下代码进行&#xff1a; from glob import glob from PIL import Image import os from tqdm import tqdm from tqdm.std import trangeimg_path glob(r"C:\Users\Administrato…

uniapp使用地图开发app, renderjs使用方法及注意事项

上次提到uniapp开发地图app时得一些问题&#xff0c;最后提到使用renderjs实现app中使用任何地图&#xff08;下面将以腾讯地图为例&#xff0c;uniapp中写app时推荐使用得是高德地图&#xff0c;无法使用腾讯地图&#xff08;renderjs方式除外&#xff09;&#xff09;。 1、…

独立静态ISP:互联网连接的新选择

在数字化时代&#xff0c;互联网连接的质量直接影响着我们的工作与生活。随着技术的发展&#xff0c;独立静态ISP&#xff08;Internet Service Provider&#xff0c;互联网服务提供商&#xff09;逐渐成为企业和个人用户关注的焦点。本文将从五个方面探讨独立静态ISP的优势、应…

Trieve实践:好用功的开源RAG

目录 RAG概述 RAG架构 Trieve Trieve介绍 Trieve使用 初始化 自行搭建RAG Trieve是什么&#xff0c;RAG是什么&#xff0c;本文来带你了解。其实在很多产品应用里面都会有RAG,比如ai客服&#xff0c;针对性的智能问答&#xff0c;都是基于RAG实现的 RAG概述 RAG 是一种…

【竞技宝】英超:曼城击败热刺,赢西汉姆联就夺冠

曼城在英超补赛中跟热刺相遇,这场比赛对于双方来说都必须赢。曼城要是拿不下热刺,联赛夺冠形势就不容乐观。热刺则是需要击败曼城,保留拿到下赛季欧冠的一线希望。所以,热刺和曼城开场就全力以赴。上半场热刺和曼城门将都做出精彩扑救,比分维持在0比0。下半场曼城金靴哈兰德发威…

基于springboot实现医药管理系统项目【项目源码+论文说明】

基于springboot实现医药管理系统演示 摘要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&…

airmon-ng start wlan0

错误原因&#xff1a;有一些后台程序干扰&#xff0c;导致无法成功启动监听模式 解决&#xff0c;关闭提示的进程即可 kill -9 PID号

apache与nginx下安装zabbix

apache下安装zabbix #进入zabbix官网 https://www.zabbix.com/ #选择好要配置的服务#安装zabbix存储库 [rootzabbix-server ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm [rootzabbix-server ~]# yum clean all #清理…

C++ STL概念之 迭代器

什么是迭代器 迭代器&#xff08;Iterator&#xff09;是一个在容器中访问元素的对象&#xff0c;提供了一种方法来顺序访问容器中的元素&#xff0c;而无需暴露容器的底层表示。 或者说 行为像指针一样的类型。可能是指针也可能是被类封装的指针&#xff0c;不关注容器底层细…

SWAT模型高阶应用暨SWAT模型无资料地区建模、不确定分析及气候、土地利用变化对水资源与面源污染影响分析

原文链接&#xff1a;SWAT模型高阶应用暨SWAT模型无资料地区建模、不确定分析及气候、土地利用变化对水资源与面源污染影响分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247604401&idx4&snd2d39846dce07bee765c820de1cf92f3&chksmfa821956cdf5904…

GM812条码模块的技术参数

扫码性能参数 *测试条件&#xff1a;环境温度23℃&#xff1b;环境照度300 LUX&#xff1b; **测试条件&#xff1a;测试距离&#xff08;最小景深最大景深&#xff09;/2&#xff1b; 环境温度23℃&#xff1b;环境照度300 LUX&#xff1b; *规格如有更改&#xff0c;恕不另…

嵌入式学习72-复习(字符设备驱动框架)

编辑 drivers/char/Kconfig 为了在make menuconfig是能够显示出我们写的驱动程序 make menuconfig 编辑 drivers/char/Makefile 才是真正把编写好的源文件加入到编译中去 make modules cp drivers/char/first_driver.ko ~/nfs/rootfs/

Kotlin扩展函数和运算符重载

扩展函数 fun String.lettersCount():Int{var count 0for(i in this){if(i.isLetter())count}return count } fun main(){val str:String "12we"println(str.lettersCount()) } 相当于直接将方法写在类里面。函数体内可以直接使用this而不用传参。 运算符重载 …

织梦dedecms企业网站模板安装教程

很多新手在拿到织梦模板后不知道如何安装&#xff0c;所以&#xff0c;云部落(Yunbuluo.Net)资源网专门整理了一份图文版织梦模板通用安装教程&#xff0c;希望对大家有所帮助。 第一步&#xff1a; 将域名解析绑定好之后&#xff0c;上传下载的模板至您的WEB根目录中&#xf…

品鉴中的食物搭配:如何创造美味的红酒与食物组合

品鉴云仓酒庄雷盛红酒时&#xff0c;食物搭配是一个不可忽视的环节。通过巧妙的搭配&#xff0c;红酒与食物可以相互衬托&#xff0c;呈现出更加美妙的风味。下面就让我们一起探讨如何创造美味的红酒与食物组合。 首先&#xff0c;了解红酒与食物的搭配原则是关键。一般来说&a…

React Native 开发心得分享

有一段时间没更新了&#xff0c;花了点时间研究了下 React Native&#xff08;后续用 RN 简称&#xff09;&#xff0c;同时也用该技术作为我的毕设项目(一个校园社交应用&#xff0c;仿小红书)&#xff0c;经过了这段时间的疯狂折腾&#xff0c;对 RN 生态有了一定的了解&…