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

文章目录

选择排序和冒泡排序区别

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

选择排序(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 之前。例如,冒泡排序和插入排序是稳定的,因为它们不会改变相同元素的相对顺序。

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

相关推荐
@小博的博客19 分钟前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
泉崎2 小时前
11.7比赛总结
数据结构·算法
你好helloworld2 小时前
滑动窗口最大值
数据结构·算法·leetcode
JSU_曾是此间年少3 小时前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs114 小时前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
此生只爱蛋4 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp5 小时前
Java:数据结构-枚举
java·开发语言·数据结构
昂子的博客5 小时前
基础数据结构——队列(链表实现)
数据结构
lulu_gh_yu6 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>7 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode