完整教程:【排序算法】③直接选择排序

系列文章目录

 第一篇:【排序算法】①直接插入排序-CSDN博客

第二篇:【排序算法】②希尔排序-CSDN博客

第三篇:【排序算法】③直接选择排序-CSDN博客

第四篇:【排序算法】④堆排序-CSDN博客


目录

系列文章目录

前言

什么?就是一、直接选择排序

算法思想

二、实现直接选择排序

三、分析直接选择排序

直接选择排序的特征

与直接插入排序的区别

总结



前言

直接选择排序比较简单,达成起来较容易,但是直接选择排序与直接插入排序的区别难以理清,笔者下方整理一个表格供参考。


一、直接选择排序是什么?

算法思想

直接选择排序的思想是:

每次从未排序部分选择最小(或最大)元素,放到已排序部分的末尾。 通过不断选择剩余元素中的最小者来实现排序。

直接选择排序为什么能建立排序?
很好理解,假设i=0是数组下标,n是内容个数。直接选择排序就是方便粗暴的从未排序的信息集中挑出最小/最大,放在第i个位置处,i++,未排序的数据个数就变成n-i个,重复直到i==n-1(数组下标)。

二、实现直接选择排序

博主这里以升序为例:

void SelectionSort(int* a, int n)
{
if (!a)return;
for (int i = 0; i < n; ++i)
{
int _min = i;
for (int j = i + 1; j < n; j++)
{
if (a[j] < a[_min])_min = j;
}
swap(&a[i], &a[_min]);
}
}
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}

依据算法,从素材集中,挑选处特征码最小/最大的数据放在已排序的末尾。

①_min变量用于存储合适材料的下标。从第i号,到之后的未排数据中选择最小或最大的数据,_min保存其下标,等内循环结束交换数据值;

②外循环,每一次循环的目的是在未排信息中寻找最小/最大的值;内循环,作用是依次拿未排内容与a[i]比较大小。

三、分析直接选择排序

直接选择排序的特征

1. 直接选择排序十分好理解,但是效率不是很好,故实际中很少使用;
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4.稳定性:不稳定。

与直接插入排序的区别

直接选择排序与直接插入排序的区别是什么?

直接选择排序: 每次从未排序部分选择最小(或最大)元素,放到已排序部分的末尾。 通过不断选择剩余元素中的最小者来实现排序。

直接插入排序: 将未排序部分的元素逐个插入到已排序部分的适当位置。 即,将元素插入到已排序序列中的正确位置,从而逐步构建有序序列。

特性直接选择排序直接插入排序
基本思想在未排序序列中选择最小元素放入已排序序列末尾将未排序元素插入已排序序列的合适位置
操作核心选择 + 交换比较 + 移位
时间复杂度永远 O(n²)(任何情况平均 O(n²),但有序时最优 O(n)
空间复杂度O(1)(原地)O(1)(原地)
稳定性 不稳定(交换破坏顺序)稳定(保持相同元素顺序)
数据敏感性无关数据分布(固定比较次数)强相关(有序数据效率飙升)
交换/移动次数交换次数少(n-1次)移动次数多(需整体移位)


总结

本文是【排序算法】系类第三篇,直接选择排序较为简单故篇幅较短。

来不及怀念直接选择排序了,接下来登场的是常用且效率高、结构较复杂的另一种选择排序算法:堆排序!

posted on 2025-08-10 21:35  ljbguanli  阅读(23)  评论(0)    收藏  举报