常见的排序算法(二) 选择排序

2023年金蝶云星辰初级顾问认证参考试题(1) 最新积累的考试真题,答案只供参考(49分T~T),欢迎大佬们更正,私聊我修改,有新的试题也可以私聊我,日后会完善题库!大家一起努力,预祝大家顺利通过!1.【简单】生产环节中,客户老板希望掌握材料的超发或漏发情况,,以便分析用料情况,对材料浪费进行管控,可以查看什么报表?⒉[中等】客户主营电气柜的生产销售,商品为非标品需定制,又因交期效短,需要边生产边补料,以下哪个功能最适合该客户场景?15.【简单】在给商品设置科目关联时,分别按照单个商品,商品类别,所有商品设置了对应客户,()优先级最高。 阅读详情

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

选择排序:

思想

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序

在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

因为实现方法比较多,也易实现,故只给出一种代码以下并非最优算法或者有所改进和优化。

因为改进和优化的选择排序可能存在BUG,并且实现和一下代码差不多,故而,不在一一列举。

void SelectiongSort(int* a, size_t size)  //选择排序
{
	assert(a);
	int  min;
    for (int i = 0; i < size ; i++)
  {
         min = i;
        for (int j = i + 1; j < size; j++)
        if (a[j] < a[min])
            min = j;
        swap(a[i], a[min]);
   }

}

选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。

比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。



堆排序

堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

既然是堆排序,自然需要先建立一个堆,而建堆的核心内容是调整堆,使二叉树满足堆的定义(每个节点的值都不大于其父节点的值)。

(此处本欲给出图片,但因网站的问题,便不给出,望读者见谅。)

void Adjust(int* a, int i, int size)
{
	assert(a);
  
	int parent = i;
	int child = 2*i +1;
	while(child < size)
	{
	if(child+1 < size && a[child+1]>a[child])
		++child;

	if(a[parent] < a[child])
	{
		swap(a[parent],a[child]);
		parent  =child;
		child = 2*parent +1;
	}
	else
		break;
	}
}

void HeapSort(int* a, size_t size)   //堆排序
{
	for(int i = (size-2)/2 ; i >0; --i)
	   Adjust(a,i,size);

	for(int i = 0;i<size; ++i)    //每次把根节点和最后一个节点相交换
	{                               //也就是说把最大的数放到了最后一个位置
		swap(a[0],a[size-1-i]); //最后便排序完毕
		Adjust(a,0,size-i-1);
	}
	

}

算法分析

堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。

平均性能    O(N*logN)。

其他性能

由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。

堆排序是就地排序,辅助空间为O(1).

它是不稳定的排序方法。(排序的稳定性是指如果在排序的序列中,存在前后相同的两个元素的话,排序前 和排序后他们的相对位置不发生变化)


用Python玩转Iris数据集:从数据加载到可视化分析的完整指南 本文提供了使用Python处理Iris数据集的完整指南,涵盖数据加载、探索性分析、特征工程和可视化呈现等关键步骤。通过Pandas、NumPy、Matplotlib和Seaborn等工具,读者将学习如何从零开始完成一个机器学习项目的数据分析流程,掌握数据科学的核心技能。 阅读详情

相关推荐

使用Tansformer分割三维腹部多器官--UNETR实战

不会 transformer 没关系,本教程开箱即用。Tina姐总算对transformer下手了,之前觉得难,因为刚开始学序列模型的时候就没学会。然后就一直排斥学transformer。这两周没什么事,加上MONAI有现成的教程,就打算先跑通后,再学理论。然后,顺利的跑通了代码,再学了一周理论,发现它也不过如此嘛,入门还是很容易的。有同学想了解的transformer的话,可以先看完这个实战教程,如果感兴趣,后续会出一个transformer入门路线。利用纯Transformers作为编码器来学习输入量的

Tina姐的博客 1万+

算法与数据结构基础<二>----排序基础之选择排序法

最简单的排序算法:选择排序法: 在上一次https://www.cnblogs.com/webor2006/p/13914100.html来了个算法的开篇,介绍了线性查找法的简单算法,这次继续夯实基础,而排序就是算法中非常基础又非常重要的算法,如题所示,这里先来学习最最简单的排序算法----选择排序。 思想: 它的排序思想比较简单: 过程分析: 对于它的实现其实是有两种,咱们先来看一下这两种的...

webor2006的博客 711

ADP在线自适应动态规划之持续激励条件

在线自适应动态规划之持续激励条件 在在线自适应动态规划算法中,需要通过满足持续激励条件(Persistent Excitation Condition)保证critic网络权值的收敛性,一般的做法都是在算法初期在输入端引入探测噪声(Probing Noises)来保证数据的丰富性,但是由于在输入端引入噪声会给系统带来一些不好的影响,甚至可能破坏系统的稳定性。因此,出现了一些其他的方法来避免引入探测噪声,受阅读所限,我目前了解两种: Concurrent Learning(CL) Experience Re

qq_43435956的博客 6163

数据结构中常见的几种排序算法

    数据结构中常见的几种排序算法 快速排序 目录 数据结构中常见的几种排序算法 快速排序 插入排序 希尔排序 归并排序 堆排序 选择排序 冒泡排序 基数排序 快速排序 基本思想: 基准分割法  a) 通过一趟排序将要排序的数据分割成独立的两部分其中一部分所有的数据要比另外的一部分数据都要小  b) 按照此方法对这两部分数据进行快速排序  案例:3 6...

qq_39380590的博客 1万+

lift off工艺为什么常用蒸发的方式镀膜?

电子束蒸发中,蒸发物质从源头直接升华并沿直线路径沉积到晶圆上,它可以避免金属在掩模侧壁的覆盖,只在表面进行沉积。在镀膜结束后,在进行光刻胶剥离时,去胶液无法与光刻胶接触反应,导致光刻胶剥离很困难。欢迎加入我的半导体制造知识星球社区,目前社区有1900人左右。我观察到晶圆厂中lift off工艺,镀膜都是用的电子束蒸发的方式,很少有用磁控溅射的方式,为什么?需要增加撕胶工序,将胶面上覆盖的膜层撕掉,使光刻胶露出,这样才容易剥离。上图为磁控溅射的膜层截面图,去胶液很难突破侧壁膜层,进行反应。

1688

极速建站!用1Panel面板一键部署Halo博客的保姆级教程 | 企业官网/个人博客搭建教程

个人博客是一种在互联网上发布自己的文章、图片、视频等内容的平台,通常以文字为主要形式,但也可以包含其他媒体。个人博客的用途非常广泛。它可以用来记录博主的日常生活、分享自己的知识和经验、展示自己的作品和技能,以及交流自己的观点和看法。通过个人博客,博主可以与读者建立联系,分享自己的见解和体验,同时也可以从读者那里获得反馈和建议。

zeruns的博客 1832

php选择排序算法原理_选择排序算法的介绍和实现

摘要:​选择排序法是一种不稳定的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序法是一种不稳定的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未...

weixin_34638776的博客 175

【气候极端指数】MATLAB计算各种气候极端指数

简介各类气候极端指数,及其MATLAB计算代码

WW、forever的博客 4918

10大排序算法总结

查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且

冷夜轩的博客 681

Python爬虫实战:社交媒体热点事件追踪与情感分析可视化

本文探讨了如何利用Python爬虫技术从微博和Twitter等社交媒体平台抓取数据,进行热点事件追踪和情感分析,并通过可视化方式展示舆论情感变化。文章详细介绍了最新的爬虫技术、数据处理方法和可视化实现,提供了完整的代码示例,帮助读者构建自己的社交媒体分析系统。关键词:Python爬虫、社交媒体分析、情感分析、数据可视化、热点追踪爬虫框架:Requests-HTML、aiohttp、Twint(Twitter专用)数据处理文本处理:Jieba(中文分词)、NLTK(英文处理)情感分析。

2201_76125261的博客 1105

手把手教你学Simulink--基于Simulink的高速公路自动驾驶场景仿真建模

特点车道保持:自动调整车辆方向以保持在车道中央。自适应巡航控制(ACC):根据前方车辆的速度自动调节车速。换道辅助:安全地变换车道以超过慢速行驶的车辆或准备驶离高速公路。紧急制动:检测潜在碰撞并采取措施避免事故。挑战安全性:确保所有功能在各种条件下都能可靠运行。实时性:处理大量传感器数据,并迅速做出反应。复杂性:集成多个子系统,包括感知、规划与控制。首先明确要模拟的任务内容。车辆需保持在车道内行驶。根据交通情况自动调整速度。安全地执行换道操作。在必要时实施紧急制动。

MHD0815的博客 248

常见排序算法(二)(选择排序)

本文介绍排序算法中的选择排序,选择排序分为三种:直接选择排序、树形选择排序(锦标赛排序)、堆排序,并对每种排序算法进行了分析,附带java实现代码。

柯南的博客 6271

断层错动和近断层地震动联合作用下软岩隧洞衬砌损伤分析

摘要 本文提出了一种基于Python的软岩隧洞衬砌损伤分析系统,重点研究断层错动和近断层地震动的联合作用效应。系统采用有限元方法建立隧洞-围岩体系模型,通过非线性动力分析评估衬砌结构损伤。研究内容包括:1)建立考虑应变软化的软岩本构模型;2)基于位错理论模拟断层错动过程;3)合成具有速度脉冲效应的近断层地震动;4)开发完整的动力响应分析流程。结果表明,所提出的方法能有效评估软岩隧洞在复杂地质条件下的抗震性能,为工程设计提供理论依据。 关键词:软岩隧洞、断层错动、近断层地震动、损伤分析、Python、有限元法

max500600的博客 845

常见排序算法整理(二)----希尔排序,选择排序

这几天趁着放假有时间,把几种常见的排序算法整理下,本次整理主要是根据http://blog.youkuaiyun.com/u012501459/article/details/44594719所写排序算法为基础,加上自己的一些理解,整理所得,下面继续介绍两种排序算法,希尔排序,选择排序。希尔排序希尔排序就是直接插入排序的进阶版,基本思想就是将一个无序数组分为几个子数组分别进行直接插入排序,排序完成后数组会基本有

Lurzeood的博客 397

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

几种常见的排序算法

常见排序算法分为四类:插入排序、选择排序、交换排序、归并排序

qq_45804675的博客 551

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

十种常见排序算法

0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 0.2 算法复杂度 0.3 相关概念 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 .

liyongchunscr的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

常见的七种排序算法

目录 1.排序算法的概念及其运用 1.1 排序的概念 1.2 排序运用 1.3 常见的排序算法 2.常见排序算法的实现 2.1 插入排序 2.1.1直接插入排序 2.1.2 希尔排序(缩小增量排序) 2.2 选择排序 2.2.1 直接选择排序 2.2.2 堆排序 2.3 交换排序 2.3.1 冒泡排序 2.3.2 快速排序 2.4 归并排序 3.排序算法复杂度及稳定性分析 1.排序算法的概念及其运用 1.1 排序...

m0_58367586的博客 3312

常见排序算法之选择排序——直接选择排序、堆排序

哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的选择排序,主要有直接选择排序以及——堆排序(有点难理解),包您一看就会,快来试试吧~ ​

保护小周ღ的博客 2342

常见的排序算法

说起排序大家想必一定不陌生了,在生活中排序可是无处不在: 就比如你想在想买手机:你想以手机的价格为主,我们想看一看最贵的手机: 那么我们就可以以价格来作为排序,先看最贵的,再看最便宜的,比如: 我们可以看到有很多方式来供我们选择; 如果我们先要看看大学排名也是可以的: 当然,这些数据量都是很大的,为了能够让程序更快的做出反应,提供给用户更好的体验,那么高效、快速、稳定的排序算法是必不可少的! 下面我们来介绍一下几种比较常见的排序! 当然有的学校可能还会学:桶排序、基数排序等排序算法(比如我的学校😊😊

南猿北者博客 1219

C++常见排序算法——选择排序算法

首先说一下选择排序的基本算法思想: 如果有N个元素需要排序,那么首先从N个元素中找到最小的那个元素与第0位置上的元素交换,然后再从剩下的N-1个元素中找到最小的元素与第1位置上的元素交换,之后再从剩下的N-2个元素中找到最小的元素与第2位置上的元素交换,.......直到所有元素都排序好。 以从小到大排序为例:a[5]={3,5,4,1,0}; 选择出5个元素中最小的0,与a[0],也就是3进行交换,交换后的序列变为{0,5,4,1,3}; 选择出后面4个元素中最小的1,与a[1],也就是5进行交换

lengxuan001的博客 6626

常见排序算法

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持 不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳 定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

2301_80501383的博客 2029

排序算法(二)—— 选择法排序算法

1、选择法排序简介 选择法排序算法是一种常用的排序算法,他的实现方法是遍历数组所有元素,找出最小的元素,将它与第一个元素交换;然后遍历剩下的元素,找出最小的元素并与第二个元素交换;接下来再遍历剩下的元素,找出最小的元素并与第三个元素交换;如此反复,知道数组末尾。 比如一个5个元素的数组5、3、1、2、4,使用选择法进行排序,排序步骤如下所示。 2、选择法代...

bigmarshal的博客 5127

Java常见排序算法-选择排序

选择排序(Selection Sort)是一种简单的排序算法,在要排序的一组数中,选出最小的数和第一个数交互位置,剩下的中再挑最小的放第二位,以此类推。其基本思想是在待排序序列中选择最小(或最大)的元素,将其与序列的第一个元素交换位置,然后在剩余的元素中继续选择最小(或最大)的元素,将其与序列的第二个元素交换位置,以此类推,直到整个序列有序为止。选择排序的具体实现过程如下:遍历待排序序列,找到其中最小的元素,并记录其下标。将最小的元素与序列的第一个元素交换位置。

super_mochi1 2181

常见排序算法以及实现

常规快排:在待排序区间中任取一个元素作为枢轴(pivot,或称基准值,通常选取区间首元素),然后按照基准值大小将区间中元素分割成左右两部分,左侧区间中元素小于基准值,右侧区间中元素大于等于基准值,即基准值已经放在其该放的位置上,该过程称为一次划分。它的工作原理是每次检查相邻两个元素,如果前面的元素与后面的元素满足给定的排序条件,就将相邻两个元素交换。那么,当整个序列有序的时候,每次递归就会划分出特别长的一段右区间,递归的层数是 n次,每次要遍历整个数组一遍,时间复杂度就退化成 n**2。

shdbdndj的博客 1480

选择排序算法

  选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。   选择排序就是从当前未排序的整数中找一个最小的整数,将它放在已排序的整数列表的最后。   要点: 比较相邻的两个数,如果左边的数大于右边的数,就进行交换。   例如: 将数组 { 4,2,8,0

大彤小忆的博客 9074

排序算法(二):选择排序

选择排序是一种简单、易理解的排序算法,适合用于学习排序的基本思想。尽管它的时间复杂度较高,适用于小规模数据排序,但在实际应用中,可以根据不同场景选择更高效的排序算法,如快速排序或归并排序。通过本文的分析和代码示例,希望大家能够深入理解选择排序的工作原理,能够在需要的场合灵活运用它,并为进一步学习其他排序算法打下坚实的基础。选择排序虽然简单,但它依然是计算机科学中不可忽视的经典算法之一。希望你在学习排序算法的过程中,能够通过这篇文章掌握选择排序的精髓。

一碗黄焖鸡三碗米饭的博客 1090
上一篇: 常见的排序算法(一) 插入排序
下一篇: 常见的排序算法(三) 交换排序(冒泡排序,快速排序)
Csoul89757
博客等级 码龄10年 34粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值