直接选择排序及其稳定性分析

news2024/11/25 10:13:34

直接选择排序

直接选择排序是一种很直观的排序方法。其操作是这样:先在未排序的序列中选择最小的元素(或最大的元素),把它与第一个元素交换,放在第一个位置,再在剩余未排序序列中选择第二小的,与第二个元素交换,放在第二个位置,以此类推,直到所有序列排序完毕。

这种排序方法应该是大部分人最直观的一种排序方法,下面就根据一个实际例子来看看其过程。

排序过程

下面以一个未排序的数组[5,1,2,3,4]为例,展示其排序过程:

select_sort

算法效率

时间复杂度: O ( n 2 ) O({n}^{2}) O(n2),因为无论数组是哪种情况,都需要进行两次for循环,都是确定数组前n-1个最小值,即使数组是本身有序的。

空间复杂度 O ( 1 ) O({1}) O(1),因为只使用有限个数的变量。

实现代码

#include <stdio.h> 

void swap(int *xp, int *yp) 
{ 
	int temp = *xp; 
	*xp = *yp; 
	*yp = temp; 
} 

void selectionSort(int arr[], int n) 
{ 
	int i, j, min_idx; 

	// One by one move boundary of unsorted subarray 
	for (i = 0; i < n-1; i++) 
	{ 
		// Find the minimum element in unsorted array 
		min_idx = i; 
		for (j = i+1; j < n; j++) 
		if (arr[j] < arr[min_idx]) 
			min_idx = j; 

		// Swap the found minimum element with the first element 
		swap(&arr[min_idx], &arr[i]); 
	} 
} 

/* Function to print an array */
void printArray(int arr[], int size) 
{ 
	int i; 
	for (i=0; i < size; i++) 
		printf("%d ", arr[i]); 
	printf("\n"); 
} 

// Driver program to test above functions 
int main() 
{ 
	int arr[] = {64, 25, 12, 22, 11}; 
	int n = sizeof(arr)/sizeof(arr[0]); 
	selectionSort(arr, n); 
	printf("Sorted array: \n"); 
	printArray(arr, n); 
	return 0; 
} 

have a try

稳定性分析

稳定性就是指对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和排序之后没有发生改变。通俗地讲就是有两个关键字相等的数据A、B,排序前,A的位置是 i ,B的位置是 j,此时 i < j,则如果在排序后A的位置还是在B之前,那么称它是稳定的。

直接选择排序是一个不稳定的排序,其将最小值和队头元素的交换过程可能会导致相同元素的顺序发生交换。

例如下面的例子, [3A, 2, 3B, 5, 1], 其最终将排序成[1, 2, 3B, 3A, 5],如下图所示:

select_sort2

可以看出在这个过程中,相同元素的相对位置发生了改变。

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

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

相关文章

驾驭Dubbo:探索其核心概念与突出特性,助力分布式系统升级

1、Dubbo简介 Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo 提供的丰富服…

147-Prolixe-KeygenMe#1

Exeinfo查壳&#xff0c;发现没有壳&#xff0c;是Delphi程序 OD字符串搜索&#xff0c;找到关键位置&#xff0c;发现一个关键的call&#xff0c;和一个strcmp比较函数。 进入关键call进行分析&#xff0c;结合IDA。 分析这个call&#xff0c;发现输入的name字符串长度必须…

北欧又一国家布局量子

光子盒研究院 6 月 8 日&#xff0c;挪威奥斯陆城市大学、Simula 研究实验室在内的QCNorway研讨会团队撰写了一份立场文件&#xff0c;其中&#xff0c;对新兴的挪威量子战略提出了建议。 “世界正在接近一场量子革命——一个为期40年的梦想&#xff0c;利用量子力学的现象使计…

学习笔记之法理学

目录 法理学第一节 法的概述一、法的概念二 法的特征三、法的作用&#xff08;一&#xff09;法的规范作用&#xff08;教预引制评&#xff09;1. 指引作用2.评价作用3.预测作用4.强制作用5.教育作用 &#xff08;二&#xff09;法的社会作用(考察较少&#xff0c;两个考点) 四…

浅谈医院电气火灾的起因与预防

摘要:医院属公共场所&#xff0c;建筑密集&#xff0c;人员集中&#xff0c;且弱势群体&#xff08;病人&#xff09;居多&#xff0c;一旦发生火灾&#xff0c;可能造成重大财产损失和人员伤亡。在引起医院火灾的各种因素中&#xff0c;电气火灾由于医院建筑功能与其他建筑不同…

网络安全自学秘籍

前言 想学网络安全但是无从下手的小白看过来&#xff0c;非常系统的学习资料&#xff0c;无数小白看了这份资料都已经成功入门&#xff0c;涵盖多个网络安全知识点&#xff0c;我愿称之为网络安全自学宝典。 一、概念性知识 1、了解什么是网络安全 2、清楚法律法规 3、网络安…

【Java】java中接口幂等性解决方案

文章目录 一、概念二、场景三、解决方案3.1、数据库唯一标识3.2、乐观锁3.3、悲观锁3.4、Token机制3.5、分布式锁 四、总结 一、概念 一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数&#xff0c;或幂等方法&#xff0c;是指可以使用相同参数…

shape_based_matching lineMod开源代码学习

github开源代码地址&#xff1a; https://github.com/meiqua/shape_based_matching 针对匹配精度问题&#xff0c;原作者采用了sub-pixel icp的方法进行了最后的finetune&#xff0c;涉及到的相关原理可以查看&#xff1a;亚像素边缘提取与ICP2D的理解 - 知乎 涉及到的论文…

Precision Neuroscience提出第7层皮层接口:可扩展的微创脑机接口平台

大脑皮层包含六层结构&#xff0c;美国精密神经科学公司&#xff08;Precision Neuroscience Corporation&#xff09;的研究人员提出了第7层皮层接口&#xff1a;可拓展的微创脑机接口平台。构建了一种模块化的和可拓展的脑机接口平台&#xff0c;包括高通量薄膜电极阵列和微创…

新加坡市场扩张指南:品牌布局策略与挑战解析

随着全球化的发展和市场竞争的加剧&#xff0c;越来越多的企业开始考虑将业务拓展到新的市场。其中&#xff0c;新加坡作为一个经济繁荣、政治稳定、文化多元的国家&#xff0c;成为许多品牌出海的首选目的地之一。然而&#xff0c;要在这个激烈竞争的市场中取得成功&#xff0…

绘制stm32最小系统板

原理图&#xff1a; 不使用串口烧录&#xff0c;所以BOOT0和BOOT1都接地。 VDD&#xff1a;就是单片机的供电电压。 VDDA&#xff1a;VDD后面有个A&#xff0c;AAnalog&#xff0c;表示模拟的意思&#xff0c;就是芯片内部模拟器件的工作电压。 VSSA&#xff1a;表示模拟器件…

2023 Softing暑期培训计划

通过以实践为导向的培训课程提高能力 Softing将在2023年暑期为您提供全面的培训课程。在Softing线上研讨会中&#xff0c;您将体验到结构紧凑的培训课程&#xff0c;包含实用的用户问题讨论以及完善的理论知识交流&#xff0c;而无需学习冗长而枯燥的标准。无论您是初学者还是…

Unittest二次开发实战

目录 前言 unittest.TestResult类简介 TestResult类定制目标 实现步骤 测试结果summary格式规划 单个用例结果格式规划 用例tags和level的实现 根据测试方法对象获取用例代码 单个用例结果类的实现 TestResult属性及初始化方法 测试开始和测试结束 用例开始和用例结束 1. 重写恢…

Python面向对象编程2-面向过程的银行账号模拟程序 项目2.3 单个账户完整项目版本1

项目总目标&#xff1a;用面向过程思想设计一个简单的银行账号模拟程序。本次将迭代多个程序版本&#xff0c;每个版本都将添加更多功能。虽然这些程序没有达到发布的质量标准&#xff0c;但整个项目的目的是关注于代码如何与一个或多个银行账户的数据进行交互。 分析项目的必…

Windows11 WSL子系统ubuntu22.04 修改hostname

大家都知道以往我们修改 Linux系统的 hostname只要修改 /etc/hostname 这个文件中的名字即可&#xff0c;但是在WSL中修改该文件是无法生效的。 要修改Hostname并使它生效&#xff0c;我们必须修改 /etc/wsl.conf 文件。 编辑配置文件 sudo vi /etc/wsl.conf修改参数 将 ho…

SQL优化--如何定位慢查询?

目录 概述 检测方案 方案一&#xff1a;开源工具 方案二&#xff1a;MySQL自带慢日志 面试回答 大纲 范例 概述 在SQL中&#xff0c;“慢查询”是指执行速度较慢的数据库查询操作。 一般来说聚合查询&#xff0c;多表查询&#xff0c;表数据量过大查询&#xff0c;深度…

埃及极简史

埃及全称为阿拉伯埃及共和国&#xff0c;位于北非东部&#xff0c;领土还包括苏伊士运河以东、亚洲西南端的西奈半岛&#xff0c;埃及既是亚、非之间的陆地交通要冲&#xff0c;也是大西洋于印度洋之间海上航线的捷径&#xff0c;战略位置十分重要。 古埃及是古代四大文明古国之…

龙蜥白皮书精选:Ancert——硬件兼容性验证与守护

文/硬件兼容性 SIG Ancert 是龙蜥操作系统硬件兼容性测试套件&#xff0c;致力于验证硬件设备集成商等厂商发布的整机服务器和各种板卡外设与龙蜥操作系统 不同版本之间的兼容性&#xff0c;推动社区发行版在各种硬件设备上的适配&#xff0c;围绕龙蜥操作系统建立完善的硬件生…

Linux运维监控学习笔记5

监控项和应用集&#xff08;重点&#xff09; 监控项&#xff08;item&#xff09;&#xff1a;监控项是从主机收集的信息。一个监控项是一个独立的子标&#xff0c;代表收集数据或监控的最小的单位。 应用集&#xff08;applications&#xff09;&#xff1a;代表多个监控项…

手写数字识别Python+TensorFlow+CNN卷积神经网络【完整代码系统】

一、介绍 手写数字识别系统&#xff0c;使用Python语言&#xff0c;基于TensorFlow搭建CNN卷积神经网络算法对数据集进行训练&#xff0c;最后得到模型&#xff0c;并基于FLask搭建网页端界面&#xff0c;基于Pyqt5搭建桌面端可视化界面。 二、效果展示 三、演示视频完整代码…