常见排序算法之选择排序

目录

一、选择排序

[1.1 什么是选择排序?](#1.1 什么是选择排序?)

[1.2 思路](#1.2 思路)

[1.2.1 思路一](#1.2.1 思路一)

[1.2.2 优化思路](#1.2.2 优化思路)

[1.3 C语言源码](#1.3 C语言源码)

[1.3.1 思路一](#1.3.1 思路一)

[1.3.2 优化思路](#1.3.2 优化思路)

二、堆排序


一、选择排序

1.1 什么是选择排序?

选择排序是一种简单直观的排序算法。它的基本思想是从未排序的数据中选择最小(或最大)的元素,放到已排序数据的末尾,同时将该元素从未排序部分删除,直到所有元素都排序完成。

具体操作为,首先找到未排序部分的最小元素,并与未排序部分的第一个元素交换位置,这样就完成了一次选择。然后,将接下来未排序部分的第一个元素视为最小,找到最小元素并与未排序部分的第一个元素交换位置,以此类推,直到所有元素都排序完成。

选择排序的时间复杂度为O(n^2),是一种不稳定的排序算法。虽然它的效率相对较低,但由于其简单易实现,可以用于排序小规模的数据集合。然而对于大规模数据集合,选择排序通常不是一个最佳的选择。

1.2 思路

1.2.1 思路一

  1. 遍历第一趟数组,找出数组的最小值,与第一个数据交换
  2. 遍历第二趟数组,继续找出最小值,与第二个数据交换
  3. 重复上述动作

1.2.2 优化思路

  1. 一趟遍历找到最大和最小的元素,分别把他们放到数组的两端
  2. 缩小区间最大最小值包含的区间,找到次大,次小的元素
  3. 以此类推,直到头尾下标重合

该思路可能存在的问题 :当maxi的位置与begin重合,则begin先与mini的位置交换,此时max位置的最大值被交换走,导致endmax交换的数值是错误的(图解见下)

1.3 C语言源码

1.3.1 思路一

cpp 复制代码
//交换两个数据
void Swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
//选择排序
void SelectSort(int* arr, int n)
{
	int i = 0;
    for (i = 0; i < n-1; i++)
    {
        int min = i;
        for (int j = i+1; j < n; j++)
        {
            if (arr[j] < arr[min])
            {
                min = j;
            }
        }
        Swap(&arr[i], &arr[min]);
    }
}

1.3.2 优化思路

cpp 复制代码
//交换两个元素
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
//插入排序
void SelectSort(int* a, int n)
{
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
		int mini = begin;
		int maxi = begin;
		//在区间中找出最小的数和最大的数
		for (int i = begin + 1; i <= end; i++)
		{
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
			if (a[i] < a[mini])
			{
				mini = i;
			}
		}
		//最小的数与首交换
		Swap(&a[begin], &a[mini]);
		
		//特殊情况修正
		if (begin == maxi)				
		{
			maxi = mini;
		}

		//最大的数与尾交换
		Swap(&a[end], &a[maxi]);
		begin++;
		end--;
	}
}

二、堆排序

请点击:堆排序详细理解-CSDN博客

相关推荐
RechoYit8 分钟前
数学建模——评价与决策类模型
python·算法·数学建模·数据分析
地平线开发者22 分钟前
地平线 Sparse 多任务参考算法 SparseBevFusionMultitaskOE-V1.0
算法·自动驾驶
OKkankan1 小时前
红黑树的原理及实现
开发语言·数据结构·c++·算法
Jasmine_llq1 小时前
《B3953 [GESP202403 一级] 找因数》
算法·因数枚举算法(核心逻辑)·顺序遍历算法·单输入处理·逐行输出处理·整数算术运算
Eward-an1 小时前
【详细解析】删除有序数组中的重复项 II
数据结构·算法
sg_knight1 小时前
OpenClaw 能做什么?几个真实使用场景说明
算法·ai·大模型·llm·agent·openclaw·小龙虾
嫂子开门我是_我哥1 小时前
心电域泛化研究从0入门系列 | 第七篇:全流程闭环与落地总结——系列终篇
人工智能·算法·机器学习
爱学习的小囧1 小时前
零门槛!VCF 自动化环境登录 vSphere Supervisor 全教程
运维·服务器·算法·自动化·vmware·虚拟化
Book思议-1 小时前
线性表之顺序表入门:顺序表从原理到实现「增删改查」
数据结构·算法
I_LPL1 小时前
day52 代码随想录算法训练营 图论专题6
java·数据结构·算法·图论