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

文章目录

选择排序和冒泡排序区别

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

选择排序(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\]

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

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

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

关键点

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

稳定排序的定义

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

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

相关推荐
秋天的怀念_David10 分钟前
听故事学语言 · 数据结构篇 · 序章一 算法之问
数据结构·程序人生·算法
-dzk-1 小时前
【链表】LC 25.K 个一组翻转链表
数据结构·链表
careathers1 小时前
【数据结构】基于比较的排序算法 - 插入排序
java·数据结构·排序算法
MicrosoftCloud1 小时前
数据结构 07(上)|查找:顺序、折半、分块,ASL 到底怎么
数据结构·查找·顺序查找·折半查找·分块查找·平均查找长度·asl
Mortalbreeze2 小时前
0 - 1 BFS 算法详解:从基本原理到经典题目建模
数据结构·c++·算法·图论·宽度优先
shehuiyuelaiyuehao16 小时前
算法56,重排链表
数据结构·算法·链表
suhan18 小时前
【数据结构】七、查找:1.查找的概念、线性结构查找(顺序、折半(二分)、插值、稠密、分块、倒排)
数据结构·算法·排序算法
极客 - L U18 小时前
卡尔曼滤波从零到精通
c语言·数据结构·单片机·嵌入式硬件·mcu
Sarvartha20 小时前
栈的四则运算、栈的递归应用
数据结构·算法
GG.WinGel1 天前
三元组中心问题
java·数据结构·算法·青少年编程·蓝桥杯