C语言实现选择排序(详细讲解+代码示例)

43 阅读2分钟

在学习排序算法时,选择排序(Selection Sort)是一个非常经典的入门算法。它的核心思想是:每一轮从未排序的部分中选择最小值,放到已排序序列的末尾。虽然效率不高,但它简单直观,非常适合打基础。


一、选择排序的基本思想

给定一个数组:

5, 3, 2, 7, 6, 10, 8, 9, 1, 4

排序过程如下:

  • 第一轮:在整个数组中找到最小值 1,与第一个元素 5 交换 →
    1, 3, 2, 7, 6, 10, 8, 9, 5, 4
  • 第二轮:在下标 1~9 中找到最小值 2,与 3 交换 →
    1, 2, 3, 7, 6, 10, 8, 9, 5, 4
  • 第三轮:在下标 2~9 中找到最小值 3,发现已经在正确位置 →
    1, 2, 3, 7, 6, 10, 8, 9, 5, 4
  • 第四轮:在下标 3~9 中找到最小值 4,与 7 交换 →
    1, 2, 3, 4, 6, 10, 8, 9, 5, 7

……依次类推,直到最后一个元素。


二、代码实现

下面给出 C 语言的实现代码:

#include <stdio.h>

int main() {
    int arr[10] = {5, 3, 2, 7, 6, 10, 8, 9, 1, 4};
    int i, j, minIndex;

    // 外层循环控制轮数
    for (i = 0; i < 9; i++) {
        minIndex = i; // 假设当前元素是最小值

        // 内层循环找出未排序部分的最小值
        for (j = i + 1; j < 10; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }

        // 如果找到了比当前元素更小的值,交换
        if (minIndex != i) {
            int temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
        }
    }

    // 输出排序结果
    printf("排序结果:\n");
    for (i = 0; i < 10; i++) {
        printf("%d\t", arr[i]);
    }

    return 0;
}

三、运行结果

执行程序后输出为:

1    2    3    4    5    6    7    8    9    10

四、时间复杂度与空间复杂度

  • 时间复杂度

    • 外层循环执行 n-1 次,内层循环逐渐减少,总比较次数接近 n*(n-1)/2
    • 复杂度为 O(n^2)
  • 空间复杂度

    • 只用到常数级别的额外变量 minIndextemp
    • 空间复杂度为 O(1)

五、特点与适用场景

✅ 优点:

  • 实现简单,思路直观
  • 不需要额外空间

❌ 缺点:

  • 效率低,适合小规模数据
  • 不稳定(相同元素可能交换顺序)

📌 适用场景

  • 学习排序入门
  • 数据量很小,对性能要求不高

六、总结

选择排序就是“每轮找最小,放前面”。虽然在实际工程中应用不多(通常会用更高效的排序算法,如快速排序、归并排序),但作为基础算法,它能帮助我们更好地理解排序的本质和循环嵌套的逻辑。