首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >深入理解简单选择排序:原理、实现及与冒泡排序的核心差异

深入理解简单选择排序:原理、实现及与冒泡排序的核心差异

作者头像
fashion
发布2025-12-31 17:50:26
发布2025-12-31 17:50:26
340
举报

深入理解简单选择排序:原理、实现及与冒泡排序的核心差异

在编程学习中,排序算法是基础且重要的知识点,而简单选择排序作为常用的排序算法之一,常常与冒泡排序被初学者混淆。今天,我们就来深入剖析简单选择排序,通过具体代码示例理解其原理,并清晰梳理它与冒泡排序的关键区别。

一、简单选择排序:原理与代码实现

1. 核心原理

简单选择排序的核心思路是 “选最小(或最大),放对应位置”。它的执行过程是:在每一趟排序中,从待排序的元素里找出最小(或最大)元素的位置,然后将该元素与待排序部分的第一个元素进行交换,使得待排序部分的范围逐渐缩小,直到所有元素都完成排序。

简单来说,就像我们整理一堆杂乱的书籍,每次从剩下的书籍里挑出最薄的一本,放在已经整理好的书籍的最后面,重复这个过程,直到所有书籍都按厚度排序好。

2. 结合代码示例分析

我们先来看文档中给出的一段 C 语言代码,这段代码看似在实现排序,但实际上并非标准的简单选择排序,不过我们可以基于它进行修改和分析,更好地理解简单选择排序的逻辑。

文档中的代码如下:

#include<stdio.h>

int turn(int*b,int*c){ // 交换两个元素的函数

nt tem=*b;

*c;

em;

}

int main()

{

arr[10]={11,32,32,43,45,65,70,86,79,0};

i,j;

双重循环进行排序

=0;i<10;i++){

j=0;j<10;j++){

(arr[i]>arr[j]){ // 比较元素大小并交换

urn(&arr[i],&arr[j]);

排序后的数组

r(int a=0;a<10;a++){

intf("%d\n",arr[a]);

}

} pr fo // 输出 } }

} t if for( for(i // int int *c=t *b= i

这段代码的问题在于,内层循环j从 0 开始遍历整个数组,导致在每一轮i的循环中,会进行多次不必要的交换。而标准的简单选择排序会优化这一点,在内层循环中先找到最小元素的索引,仅在找到最小元素后进行一次交换。

下面是修改后的标准简单选择排序代码:

#include<stdio.h>

// 交换两个元素的函数

void turn(int* b, int* c) {

int tem = *b;

*b = *c;

*c = tem;

}

int main() {

int arr[10] = {11, 32, 32, 43, 45, 65, 70, 86, 79, 0};

int n = 10; // 数组长度

int i, j, min_index; // min_index用于存储最小元素的索引

// 简单选择排序核心循环

for (i = 0; i < n - 1; i++) { // 外层循环:确定每一轮的待排序起始位置

min_index = i; // 初始假设待排序部分的第一个元素是最小的

// 内层循环:找到待排序部分的最小元素索引

for (j = i + 1; j < n; j++) {

if (arr[j] < arr[min_index]) {

min_index = j; // 更新最小元素的索引

}

}

// 仅当最小元素不是待排序部分的第一个元素时,才进行交换

if (min_index != i) {

turn(&arr[i], &arr[min_index]);

}

}

// 输出排序后的数组

printf("排序后的数组:\n");

for (int a = 0; a < n; a++) {

printf("%d ", arr[a]);

}

return 0;

}

在这段标准代码中,外层循环i控制待排序部分的起始位置,从 0 到n-2(因为当i为n-1时,只剩下最后一个元素,无需排序)。内层循环j从i+1开始,遍历待排序部分的所有元素,找到最小元素的索引min_index。最后,只有当min_index不等于i(即最小元素不在待排序部分的第一个位置)时,才调用turn函数交换元素。这样一来,每一轮排序只需要进行最多一次交换,大大减少了交换操作的次数。

二、简单选择排序与冒泡排序的核心区别

冒泡排序和简单选择排序都属于简单排序算法,时间复杂度在最坏和平均情况下均为O(n²),但二者在排序原理、交换次数、稳定性等方面存在明显差异,具体如下:

1. 排序原理不同(核心区别)
  • 冒泡排序:基于 “相邻元素比较交换” 的思路。它通过相邻元素之间的比较,将较大(或较小)的元素像 “气泡” 一样逐步 “浮” 到数组的末尾。在每一轮排序中,从数组的起始位置开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素(升序排序),就交换它们的位置,直到将当前待排序部分的最大元素 “浮” 到末尾。
  • 简单选择排序:基于 “先选后换” 的思路。它在每一轮排序中,先遍历待排序部分的所有元素,找到最小(或最大)元素的索引,然后仅将该最小元素与待排序部分的第一个元素进行交换,而不是像冒泡排序那样通过多次相邻交换将元素移动到目标位置。

举个形象的例子:如果要将数组[5,3,8,1]按升序排序。

  • 冒泡排序第一轮:先比较 5 和 3,交换得[3,5,8,1];再比较 5 和 8,不交换;接着比较 8 和 1,交换得[3,5,1,8],第一轮结束,最大元素 8 “浮” 到末尾。
  • 简单选择排序第一轮:遍历数组找到最小元素 1 的索引 3,然后将 1 和待排序部分的第一个元素 5 交换,直接得到[1,3,8,5],第一轮结束。
2. 交换次数不同
  • 冒泡排序:交换次数较多。在最坏情况下(数组完全逆序),每一轮都需要进行n-i-1次交换(i为轮次),总交换次数为n(n-1)/2,与比较次数相当。即使是在最好情况下(数组已有序),虽然可以通过优化(加入标志位)避免比较,但如果不优化,仍会进行大量无效比较。
  • 简单选择排序:交换次数极少。无论数组初始状态如何,每一轮排序最多只进行一次交换(找到最小元素后与待排序起始位置元素交换),总交换次数最多为n-1次(n为数组长度)。虽然简单选择排序的比较次数与冒泡排序相近(最坏和平均情况下均为n(n-1)/2),但由于交换操作的时间开销通常比比较操作大,所以简单选择排序在实际运行中通常比冒泡排序更快。
3. 稳定性不同
  • 冒泡排序:是稳定的排序算法。稳定排序的定义是:在排序过程中,对于相等的元素,它们的相对位置不会发生改变。在冒泡排序中,只有当相邻元素不相等且需要交换时才会进行交换,对于相等的元素,不会进行交换,因此能保持它们原有的相对位置。例如,数组[3,2,2,1]进行冒泡排序时,两个 2 的相对位置在排序后不会改变。
  • 简单选择排序:是不稳定的排序算法。在某些情况下,相等元素的相对位置会被改变。例如,数组[2,2,1]进行简单选择排序时,第一轮会找到最小元素 1 的索引 2,然后将 1 与第一个元素 2 交换,得到[1,2,2],此时原来两个 2 的相对位置(第一个 2 在第二个 2 前面)虽然没有改变,但如果数组是[2a, 3, 2b](2a和2b是值相等但位置不同的元素),第一轮找到最小元素2a的索引 0,不交换;第二轮找到最小元素2b的索引 2,将2b与 3 交换,得到[2a, 2b, 3],看似相对位置未变。但如果数组是[3, 2a, 2b, 1],第一轮找到最小元素 1 的索引 3,与 3 交换得[1, 2a, 2b, 3];第二轮找到最小元素2a的索引 1,不交换;第三轮找到最小元素2b的索引 2,不交换。不过如果数组是[2b, 2a, 1],第一轮找到 1 的索引 2,与2b交换得[1, 2a, 2b],此时2a和2b的相对位置就发生了改变(原来2b在2a前面,排序后2a在2b前面),因此简单选择排序不稳定。
4. 元素移动方式不同
  • 冒泡排序:元素是 “逐步移动” 到目标位置的。例如,要将最小元素移动到数组的第一个位置,需要通过多次相邻交换,一步一步将它 “推” 到起始位置。
  • 简单选择排序:元素是 “直接跳跃” 到目标位置的。找到最小元素后,通过一次交换,直接将它放到待排序部分的第一个位置,无需逐步移动。

三、总结

简单选择排序和冒泡排序虽然同属O(n²)时间复杂度的简单排序算法,但二者在核心逻辑和实际性能上有显著区别:

  • 简单选择排序通过 “先选最小元素,再交换” 的方式,减少了交换次数,实际运行速度通常优于冒泡排序;
  • 冒泡排序通过 “相邻元素比较交换” 实现,是稳定排序算法,而简单选择排序是不稳定排序算法;
  • 在实际开发中,如果对排序稳定性没有要求,且需要处理小规模数据,简单选择排序是比冒泡排序更优的选择;如果需要保证相等元素的相对位置不变,则应选择冒泡排序(或其他稳定排序算法,如插入排序)。

掌握这两种排序算法的区别,不仅能帮助我们在编程练习中选择更合适的排序方式,也能为后续学习更高效的排序算法(如快速排序、归并排序)打下坚实的基础。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 深入理解简单选择排序:原理、实现及与冒泡排序的核心差异
    • 一、简单选择排序:原理与代码实现
      • 1. 核心原理
      • 2. 结合代码示例分析
    • 二、简单选择排序与冒泡排序的核心区别
      • 1. 排序原理不同(核心区别)
      • 2. 交换次数不同
      • 3. 稳定性不同
      • 4. 元素移动方式不同
    • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档