为啥说选择排序是不稳定的

简介: 选择排序是一种简单但不稳定的排序算法。它通过每轮选择最小元素并交换位置来实现排序,但这种交换可能破坏相同值元素的相对顺序。例如对数组 `[5, 8, 5, 2]` 排序后,两个 `5` 的顺序会发生变化,从而证明其不稳定性。

选择排序被认为是不稳定的排序算法,主要是因为在排序过程中,它会通过交换元素位置来将最小(或最大)的元素放到正确的位置,而这种交换操作可能会破坏具有相同值的元素之间的相对顺序。

原理分析

选择排序的基本思想是:每一轮从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置(或末尾位置),然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾,以此类推,直到全部待排序的数据元素排完。

在这个过程中,选择排序会不断地将当前未排序部分的最小元素与未排序部分的第一个元素交换位置。这种交换操作是导致选择排序不稳定的关键原因。

实例说明

假设有一个数组 [5, 8, 5, 2],我们使用选择排序对其进行升序排序:

  1. 初始状态[5, 8, 5, 2]
  2. 第1轮:找到最小元素 2,与第一个元素 5 交换位置,得到 [2, 8, 5, 5]
  3. 第2轮:从剩余元素 [8, 5, 5] 中找到最小元素 5,与第一个元素 8 交换位置,得到 [2, 5, 8, 5]
  4. 第3轮:从剩余元素 [8, 5] 中找到最小元素 5,与第一个元素 8 交换位置,得到 [2, 5, 5, 8]

在这个例子中,原数组中的两个 5 的相对顺序被改变了。初始时,第一个 5 在第二个 5 之前,但经过排序后,第二个 5 被交换到了第一个 5 之前。这就说明选择排序没有保持相等元素的相对顺序,因此它是不稳定的。

代码验证

下面是选择排序的Python实现,通过运行这段代码可以观察到元素相对顺序的变化:

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        # 交换当前元素与最小元素
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

# 测试用例
arr = [5, 8, 5, 2]
sorted_arr = selection_sort(arr)
print("排序前:", [5, 8, 5, 2])
print("排序后:", sorted_arr)

运行这段代码,输出结果为:

排序前: [5, 8, 5, 2]
排序后: [2, 5, 5, 8]

可以看到,排序后的两个 5 的顺序与原始顺序相比发生了变化,这验证了选择排序的不稳定性。

目录
相关文章
|
4月前
|
缓存 并行计算 搜索推荐
快速排序还有哪些优化手段
快速排序性能依赖基准选择与分区策略,常见优化包括随机基准、三数取中、小规模插入排序、尾递归优化、三路快排、并行化、混合排序等,提升效率与稳定性,适用于不同场景,使快排成为高效排序算法之一。
128 0
|
4月前
|
缓存 Java
对比 synchronized 和 volatile
`synchronized` 和 `volatile` 是 Java 并发编程中的两个关键机制,各有侧重。`synchronized` 用于实现线程的互斥访问,保证原子性、可见性和有序性,适用于需要锁的场景;而 `volatile` 更轻量,仅确保变量的可见性和有序性,适用于状态标志等无需复合操作的场景。两者可互补使用,如双重检查单例中结合二者优势。合理选择有助于提升并发性能与代码安全性。
199 0
|
C语言 Windows
【初阶C语言】关于scanf函数的超详细介绍和多组输入
【初阶C语言】关于scanf函数的超详细介绍和多组输入 我们学习一个函数,要围绕三个点:1.函数是什么 2.函数的用法 3.注意的细节
1498 0
|
Rust IDE NoSQL
Clion2022安装破解与激活教程,亲测可用
CLion是JetBrains公司旗下发布的一款跨平台C/C++/Rust IDE开发工具。
13448 1
|
4月前
|
Java 应用服务中间件 Maven
SpringBoot使用汇总
本节介绍了Spring Boot项目工程结构,包含src/main/java(业务代码)、src/main/resources(静态与配置文件)和src/test/java(测试代码)。通过@SpringBootApplication注解的启动类运行main方法即可快速启动应用。Spring Boot内置Tomcat,简化配置流程。示例展示了创建Controller、访问接口及修改默认端口的方法,帮助开发者快速上手Spring Boot开发。
127 2
|
缓存 JavaScript 算法
vue2和vue3之间diff算法的差异
vue2和vue3之间diff算法的差异
|
4月前
|
数据采集 搜索推荐 JavaScript
302重定向:临时改道的艺术与陷阱何时该用,何时该避?
HTTP 302重定向是一种临时性地址变更机制,适用于短期、可逆的场景。与永久重定向301不同,302不会将旧URL的权重传递给新URL,搜索引擎会继续索引原始页面。常见用途包括A/B测试、限时促销、服务器维护和登录跳转等。使用302时需注意设定明确的时间范围,避免误用于永久变更,并定期监控重定向状态,防止SEO权重流失或用户体验混乱。正确使用302有助于在不损害SEO表现的前提下灵活应对网站变动需求。
351 2
|
4月前
|
缓存 前端开发 NoSQL
什么是缓存雪崩?
缓存雪崩是指大量缓存key在同一时间失效,或缓存服务整体故障,导致请求全部转向数据库,造成数据库压力剧增甚至宕机。其特点是失效具有“批量性”和“突发性”,可能引发系统级联故障。常见场景包括大量key集中过期或缓存服务崩溃。相比缓存击穿,雪崩影响范围更广、危害更大,可能导致业务中断,如电商大促时订单系统瘫痪。
116 0
|
8月前
|
存储 人工智能 Java
使用Spring AI调用AI模型
Spring AI是Spring框架的模块,支持人工智能和机器学习,提供简单易用的API集成主流AI服务(如OpenAI、Azure、百度千帆等)。其主要功能包括统一API接口、提示词工程、向量存储、文本嵌入与生成。核心概念涵盖AI Client、Prompt Template和Vector Store。通过添加依赖和配置API密钥,可快速对接Chat Model并使用Advisors API增强交互体验。此外,Spring AI Alibaba项目为阿里云通义模型提供了高层次API抽象,助力开发者构建AI应用。
1108 2
|
4月前
|
JSON 缓存 API
淘宝平台关键字搜索接口接入指南(含代码示例及商品标题解析)
淘宝开放平台(TOP)提供taobao.tbk.dg.material.optional接口,支持通过关键词搜索商品并获取标题、价格等信息。本文介绍其接入方法与数据解析方式。