如何理解:选择排序中交换可能改变相同元素的相对顺序?

文章目录

选择排序和冒泡排序区别

要理解选择排序中交换可能改变相同元素的相对顺序,先回顾一下选择排序和冒泡排序区别:

选择排序(Selection Sort)

  1. 算法思想

    • 选择排序每次从未排序的部分中选择最小(或最大)的元素,并将其放到已排序部分的末尾。
  2. 步骤

    1. 从未排序的部分中找到最小(或最大)的元素。
    2. 将该元素与未排序部分的第一个元素交换位置。
    3. 重复上述过程,直到所有元素都被排序。
  3. 时间复杂度

    • 最好、最坏和平均情况的时间复杂度都是 (O(n^2))。
    • 交换操作较少,最多进行 (n-1) 次交换。
  4. 空间复杂度

    • 空间复杂度为 (O(1)),因为选择排序是原地排序。

冒泡排序(Bubble Sort)

  1. 算法思想

    • 冒泡排序通过多次遍历数组,每次比较相邻元素并交换顺序错误的元素,使得每次遍历后最大(或最小)的元素"冒泡"到数组的一端。
  2. 步骤

    1. 从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个比后一个大(或小),则交换它们的位置。
    2. 对整个数组进行多次遍历,直到没有需要交换的元素为止。
  3. 时间复杂度

    • 最好情况的时间复杂度是 (O(n))(当数组已经有序时,只需一次遍历)。
    • 最坏和平均情况的时间复杂度都是 (O(n^2))。
    • 交换操作较多。
  4. 空间复杂度

    • 空间复杂度为 (O(1)),因为冒泡排序也是原地排序。

区别总结

  • 算法复杂度:两者在最坏和平均情况下的时间复杂度相同,都是 (O(n^2))。但是选择排序在交换次数上通常比冒泡排序少。
  • 实现方式:选择排序每次找到最小(或最大)元素放到已排序部分,冒泡排序则是通过多次相邻元素的比较和交换来排序。
  • 稳定性:冒泡排序是稳定排序,选择排序是不稳定排序(因为选择排序中交换可能改变相同元素的相对顺序)。
  • 适用场景:在实际应用中,两者的使用较少,通常使用更高效的排序算法如快速排序或归并排序。但在数据量小且对交换次数要求高的情况下,可以考虑选择排序。

如何理解:选择排序中交换可能改变相同元素的相对顺序

选择排序中交换可能改变相同元素的相对顺序,这使得选择排序成为一种不稳定的排序算法。理解这一点可以通过具体的例子来说明:

示例

假设有一个数组 arr,包含以下元素:

[ \text{arr} = [4, 2, 3, 4, 1] ]

在这个数组中,有两个相同的元素 4。现在我们使用选择排序来对这个数组进行排序。

选择排序步骤

  1. 第一轮(选择最小元素 1)

    • 找到数组中最小的元素 1,它位于索引 4。
    • 1 与数组的第一个元素 4 交换。
    • 数组变为:[ 1, 2, 3, 4, 4 ]
  2. 第二轮(选择最小元素 2)

    • 找到剩余部分中最小的元素 2,它已经在索引 1。
    • 不需要交换。
    • 数组保持不变:[ 1, 2, 3, 4, 4 ]
  3. 第三轮(选择最小元素 3)

    • 找到剩余部分中最小的元素 3,它已经在索引 2。
    • 不需要交换。
    • 数组保持不变:[ 1, 2, 3, 4, 4 ]
  4. 第四轮(选择最小元素 4)

    • 找到剩余部分中最小的元素 4,它已经在索引 3。
    • 不需要交换。
    • 数组保持不变:[ 1, 2, 3, 4, 4 ]

在这个例子中,两个 4 的相对顺序没有改变,所以你可能会问为什么选择排序是不稳定的。让我们看看一个可能改变相对顺序的情况:

假设有一个数组:

[ \text{arr} = [4a, 2, 3, 4b, 1] ]

其中 4a4b 是两个相同的元素,但我们用 ab 来区分它们的相对顺序。

  1. 第一轮(选择最小元素 1)
    • 找到数组中最小的元素 1,它位于索引 4。
    • 1 与数组的第一个元素 4a 交换。
    • 数组变为:[ 1, 2, 3, 4b, 4a ]

你可以看到,现在 4b4a 之前了,这改变了它们的相对顺序。

关键点

选择排序在选择最小(或最大)元素并交换时,不会考虑相同元素的相对位置。因此,如果排序过程中涉及到相同元素的交换,原有的相对顺序可能会被打乱。

稳定排序的定义

稳定排序是指如果在排序前的数组中,有两个相同的元素 AB,且 AB 之前,在排序后的数组中 A 仍然在 B 之前。例如,冒泡排序和插入排序是稳定的,因为它们不会改变相同元素的相对顺序。

选择排序的这种行为导致它成为一种不稳定的排序算法。

相关推荐
学java的小菜鸟啊13 分钟前
第五章 网络编程 TCP/UDP/Socket
java·开发语言·网络·数据结构·网络协议·tcp/ip·udp
菜鸟求带飞_44 分钟前
算法打卡:第十一章 图论part01
java·数据结构·算法
是小Y啦1 小时前
leetcode 106.从中序与后续遍历序列构造二叉树
数据结构·算法·leetcode
万河归海4281 小时前
C语言——二分法搜索数组中特定元素并返回下标
c语言·开发语言·数据结构·经验分享·笔记·算法·visualstudio
秋夫人3 小时前
B+树(B+TREE)索引
数据结构·算法
代码雕刻家3 小时前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
AlexMercer10124 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
^^为欢几何^^6 小时前
lodash中_.difference如何过滤数组
javascript·数据结构·算法
ahauedu6 小时前
案例分析-Stream List 中取出值最大的前 5 个和最小的 5 个值
数据结构·list
X同学的开始8 小时前
数据结构之二叉树遍历
数据结构