直接选择排序

直接选择排序(Selection Sort)特性总结

  1. 理解难度:算法思想非常直观、易于理解。

    • 每一轮从未排序部分中选出最小(或最大)元素,放到已排序部分的末尾。
    • 但由于效率较低,在实际工程中很少使用
  2. 时间复杂度

    • **最好 / 平均 / 最坏情况均为 O(n\^2) **
    • 原因:无论输入数据如何,都需要进行约 \\frac{n(n-1)}{2} 次比较。
  3. 空间复杂度

    • ** O(1) **(原地排序)
    • 仅使用常数个额外变量,无需额外存储空间。
c 复制代码
void SelectSort(int *arr,int n)
{
	int begin = 0;
	int end = n - 1;
	while(begin<end)
	{
		int max = end, min = begin;//让max和min跟随begin和end更新,避免因为没有发生交换等情况最后导致错误交换值。
		for (int i = begin;i <= end;i++)
		{

			if (arr[i] > arr[max])
			{
				 max = i;//选择排序只交换当前值与最值,如果此处直接交换,会造成多次交换,破坏原有的序列。
			}
			if (arr[i]<arr[min])
			{
				 min = i;
			}

		}
		Swap(&arr[max], &arr[end]);
		if (min == end)//先选择最大值时如果最小值在序列尾,会造成交换最小值前,最小值的下标发生变化,此时需要变更下标,若选择先排最小值,同理要防止最大值出现在begin位置时造成的下标偏移
		{
			min = max;
		}
		Swap(&arr[min], &arr[begin]);
		begin++;
		end--;
	}
}

该代码中为直接选择排序的优化方法------双向选择排序,同时对首端和尾端选择,可以提升选择排序效率

相关推荐
Jasmine_llq1 小时前
《P15800 [GESP202603 六级] 选数》
数据结构·long long·逆序线性 dp·从后往前推导·转移严格遵循题意·防止总和溢出·复杂度on
疯狂打码的少年1 小时前
【数据结构】串(字符串):基本概念与存储
数据结构·笔记
致Great3 小时前
科研人的 AI,不该只回答问题:我用字节TraeWork 跑了一遍真实研究任务
算法
纵有疾風起3 小时前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
wuyk5553 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
测试_AI_一辰3 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
lucas_AI3 小时前
给YOLO检测器插 LoRA,'插对地方'比'插什么'更要命
人工智能·算法
LuminousCPP4 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil2084 小时前
leetcode 三数之和
数据结构·算法·leetcode
小小龙学IT4 小时前
C++ std::vector 底层实现深度解析:内存布局、扩容策略、移动语义与迭代器失效
开发语言·c++·算法