直接选择排序-C语言版本

news2024/11/25 10:40:29

前言

直接选择排序也是一个比较简单的排序,所以这里放在第二个进行讲解,这里和冒泡排序是有一点相似。直接选择排序和冒泡排序一样,也是具备一定的教学意义,但是没有什么实际操作的意义,因为直接选择排序的时间复杂度比较高,书写起来和插入排序又差不多,所以没有必要写直接选择排序。

直接选择排序gif

直接选择排序单趟实现

1,初始化min(最小值)=0(也就是最左边的下标)的元素为最小值

2,遍历数组,如果此时出现更小的元素,这个元素的下标是i,那么我们设定min=i

3,之后交换最左边的元素和数值最小元素,因为这个时候我们已经找到下标了

4,最后排序好的最小值放在了最左边,那么此时最左边所在位置不需要进行排序了,分离出来就可以

5,这里因为选择排序效率太低了 ,我们稍微进阶一下,我们从两侧开始,选出最小和最大,从而进行交换,虽然没有提高多少效率,但是还是比之前的速度快两倍

直接选择排序注意事项

1,这里begin和end都是外层循环,也就是随着++和--进行缩小差距

2,这里begin和end不是索引,而是缩小差距用的

3,这里是mini和maxi是索引

4,最后交换的时候交换的是下标的元素,不是下标

直接选择排序多趟实现图解

直接选择排序代码实现

//交换函数
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
//直接选择排序
void SelectSort(int* a, int n)
{
	//多趟循环
	int begin = 0, end = n - 1;
	while (begin < end)
	{
		//单趟循环,找出最小值和最大值
		int mini = begin, maxi = end;
		for (int i = begin; i <= end; i++)
		{
			//找到最小值,赋值下标
			if (a[i] < a[mini])
			{
				mini = i;
			}
			//找到最小值,赋值下标
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
		}
		//把最小值和最大值放到开头和结尾去
		Swap(&a[mini], &a[begin]);
		Swap(&a[maxi], &a[end]);
		begin++; 
		end--;
	}
}

解释:

  • 外层循环从索引0开始,直到倒数第二个元素。
  • 在每次外层循环中,假设当前索引位置的元素是未排序部分的最小值。
  • 内层循环从外层循环的下一个位置开始,遍历未排序部分的元素,寻找最小值的索引minIndex
  • 如果找到的最小值不在当前索引位置,使用Swap函数将其交换到当前索引位置。
  • 这样,每次外层循环结束时,未排序部分的最小值都被移动到了排序好的部分的末尾。

注意:

  • 直接选择排序不是稳定的排序算法,即相等元素之间的相对顺序可能会改变。
  • 直接选择排序的时间复杂度是O(n^2),在大多数情况下,它不如其他更高效的排序算法。
  • 直接选择排序的空间复杂度是O(1),因为它是原地排序算法。

选择排序时间复杂度计算

  1. 外层循环:选择排序算法有一个外层循环,它从第一个元素遍历到倒数第二个元素。这个循环执行了 n−1 次,其中 n 是数组的长度。

  2. 内层循环:对于外层循环的每一次迭代,都有一个内层循环,它从当前考虑的元素之后的第一个元素遍历到数组的最后一个元素。在第一次外层循环迭代时,内层循环执行 n−1 次;在第二次迭代时,执行n−2 次;依此类推,直到最后一次迭代,只执行一次。

  3. 总迭代次数:内层循环的总迭代次数可以表示为一个等差数列之和: (𝑛−1)+(𝑛−2)+…+2+1=n(n−1)​/2

  4. 时间复杂度:由于外层循环和内层循环的迭代次数都是 Θ(𝑛)(即线性关系),因此选择排序的总时间复杂度是 Θ(𝑛^2)。

  5. 空间复杂度:选择排序是原地排序算法,它只需要一个额外的变量来存储最小元素的索引,因此空间复杂度是 Θ(1)。

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

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

相关文章

云原生 Docker Swarm 使用详解

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

用Copilot画漫画,Luma AI生成视频:解锁创意新玩法

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;各种创意工具也层出不穷。今天&#xff0c;我们就来介绍一种全新的创作方式&#xff1a;使用Copilot画漫画&#xff0c;再将漫画放入Luma AI生成视频。 Copilot&#xff1a;你的AI绘画助手 Copilot是一款基于人工智…

Java | Leetcode Java题解之第147题对链表进行插入排序

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode insertionSortList(ListNode head) {if (head null) {return head;}ListNode dummyHead new ListNode(0);dummyHead.next head;ListNode lastSorted head, curr head.next;while (curr ! null) {if (…

C++编程:vector容器的简单模拟实现

前言&#xff1a; 在C标准库&#xff08;STL&#xff09;中&#xff0c;vector容器是最常见使用的动态数组。它结合了链表与数组的优点&#xff0c;提供了灵活的大小调整与高效的随机访问。本文将简单的对vector容器进行介绍并且对vector容器简单的模拟实现。 一、vector的文…

Project ERROR: Unknown module(s) in QT: xlsx

Qt5下Qxlsx模块安装及使用_qt5xlsx-CSDN博客 主要参考上面这篇文章&#xff01; Perl的安装与配置_perl安装-CSDN博客 1.1 windows环境安装Perl_windows perl-CSDN博客 首先&#xff0c;需要安装Perl,我安装的是Windows版本的。 Download & Install Perl - ActiveStat…

C#使用Scoket实现服务器和客户端互发信息

20240616 By wdhuag 目录 前言&#xff1a; 参考&#xff1a; 一、服务器端&#xff1a; 1、服务器端口绑定&#xff1a; 2、服务器关闭&#xff1a; 二、客户端&#xff1a; 1、客户端连接&#xff1a; 2、客户端断开&#xff1a; 三、通讯&#xff1a; 1、接收信…

【后端】websocket学习笔记

文章目录 1. 消息推送常见方式1.1 轮询 VS 长轮询1.2 SSE&#xff08;server-sent event)服务器发送事件 2. websocket介绍2.1 介绍2.2 原理2.3 websoket API2.3.1 客户端【浏览器】API2.3.2 服务端API 3. 代码实现3.1 流程分析3.2 pom依赖3.3 配置类3.4 消息格式3.5 消息类 4.…

Qwen2大语言模型微调、导出、部署实践

上篇文章&#xff1a; Qwen1.5大语言模型微调实践_qwen1.5 7b微调-CSDN博客 我们介绍了Qwen1.5 大语言模型使用LLaMA-Factory 来微调&#xff0c;这篇文章我们介绍一下微调后模型的导出、部署。 一、模型导出 在webui 界面训练好模型之后点击“Export”选项卡&#xff0c;然…

Golang | Leetcode Golang题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; type MinStack struct {stack []intminStack []int }func Constructor() MinStack {return MinStack{stack: []int{},minStack: []int{math.MaxInt64},} }func (this *MinStack) Push(x int) {this.stack append(this.stack, x)top : thi…

工程设计问题---压缩弹簧设计

参考文献&#xff1a; [1] 吴擎, 徐惟罡, 张春江. 基于师生交流机制的改进类电磁机制算法[J]. 计算机集成制造系统, 2020, 26(4): 1033-1042.

数电逻辑门电路分析和Digital仿真

文章目录 1. 逻辑门电路 2. 非门&#xff08;NOT Gate&#xff09; 3. 与门&#xff08;AND Gate&#xff09; 4. 或门&#xff08;OR Gate&#xff09; 5. 与非门&#xff08;NAND Gate&#xff09; 6. 或非门&#xff08;NOR Gate&#xff09; 7. 异或门&#xff08;XO…

VMware 桥接网络突然无法上网

VMware 桥接网络突然无法上网 0. 问题1. 解决方法 0. 问题 昨天&#xff0c;VMware 桥接网络正常使用&#xff0c;今天突然无法上网。 1. 解决方法 打开VMware的虚拟网络编辑器&#xff0c;将桥接模式的网络从“自动”改成你要使用的网卡&#xff0c;问题解决。 完成&#…

【CT】LeetCode手撕—88. 合并两个有序数组

目录 题目1- 思路2- 实现⭐88. 合并两个有序数组——题解思路 2- ACM实现 题目 原题连接&#xff1a;88. 合并两个有序数组 1- 思路 模式识别 模式1&#xff1a;两个有序数组合并 ——> 双指针模式2&#xff1a;返回结果填充到 nums1[mn] ——> 需要开辟新的数组空间 …

!力扣46. 全排列

给定一个不含重复数字的数组 nums &#xff0c;返回其所有可能的全排列 。你可以按任意顺序返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2&#xff1a; 输入&#xff1a;nu…

【SCAU操作系统】期末复习选择题例题解析

1. ____B_____操作系统能及时处理由过程控制反馈的数据并响应。 A. 分布式 B. 实时 C. 分时 D. 嵌入式 解析&#xff1a; 分布式&#xff1a;分布式操作系统是管理分布式系统的资源的操作系统。实时&#xff1a;实时操作系统&#xff08;RTOS&#x…

一个基于大模型的多功能的本地网页语音合成工具

ChatTTS-ui 是一个开源项目&#xff0c;这是一个利用 ChatTTS 技术将文本转换为语音的本地网页界面工具。它不仅支持中英文和数字的混合输入&#xff0c;还提供了丰富的API接口&#xff0c;为开发者和用户提供了极大的便利。 项目地址&#xff1a;https://github.com/jianchang…

Android 支持库迁移到AndroidX

对应官方文档&#xff1a; developer.android.com/jetpack/and… 简单点说就是&#xff0c;对App开发者而言&#xff0c;AndroidX更加友好&#xff0c;因为我们引入时&#xff0c;只需要关注AndroidX中具体的需要引入的构件版本即可。且大部分具体的构件&#xff0c;具有一致的…

【软件工程】【23.04】p2

关键字&#xff1a; 计算机软件定义、需求基本性质、创建系统类图所涉及的工作、RUP创建系统用况模型活动、软件生存周期模型、能力等级和成熟度等级区别联系&#xff1b; 模块结构图&#xff1a;深度宽度、扇入扇出、作用域、控制域&#xff1b; 程序流程图&#xff1a;语句…

单调栈(续)、由斐波那契数列讲述矩阵快速降幂技巧

在这里先接上一篇文章单调栈&#xff0c;这里还有单调栈的一道题 题目一&#xff08;单调栈续&#xff09; 给定一个数组arr&#xff0c; 返回所有子数组最小值的累加和 就是一个数组&#xff0c;有很多的子数组&#xff0c;每个数组肯定有一个最小值&#xff0c;要把所有子…

Golang | Leetcode Golang题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; func getIntersectionNode(headA, headB *ListNode) *ListNode {if headA nil || headB nil {return nil}pa, pb : headA, headBfor pa ! pb {if pa nil {pa headB} else {pa pa.Next}if pb nil {pb headA} else {pb pb.Next}}retu…