当前位置:首页 > C > 正文

C语言稳定排序算法详解(从零开始掌握冒泡排序等稳定排序方法)

在编程中,排序是一个基础而重要的操作。特别是在使用 C语言稳定排序 算法时,理解“稳定性”这一概念尤为关键。本文将带你从零开始,深入浅出地学习什么是稳定排序、为什么需要它,并通过一个经典例子——冒泡排序,来实现一个完整的 C语言排序教程

什么是稳定排序?

稳定排序(Stable Sort)是指:如果待排序的序列中存在多个相同关键字的元素,排序后这些元素的相对位置保持不变。

举个例子:假设有如下学生列表(按姓名和分数):

  • 张三(85分)
  • 李四(85分)
  • 王五(90分)

如果我们按分数排序,且使用稳定排序算法,那么排序后“张三”仍然会排在“李四”前面,因为他们在原始序列中就是这个顺序。

C语言稳定排序算法详解(从零开始掌握冒泡排序等稳定排序方法) C语言稳定排序 稳定排序算法 C语言排序教程 冒泡排序实现 第1张

常见的稳定排序算法有哪些?

在 C 语言中,以下排序算法是稳定的:

  • 冒泡排序(Bubble Sort)
  • 插入排序(Insertion Sort)
  • 归并排序(Merge Sort)
  • 计数排序(Counting Sort)

而不稳定的排序包括快速排序、堆排序等。

动手实现:用 C 语言编写冒泡排序(稳定排序)

下面是一个完整的 冒泡排序实现 示例。冒泡排序通过相邻元素比较和交换,逐步将最大(或最小)元素“冒泡”到末尾。由于它只在元素严格大于(或小于)时才交换,因此相等元素不会改变相对位置,属于稳定排序。

#include <stdio.h>void bubbleSort(int arr[], int n) {    for (int i = 0; i < n - 1; i++) {        for (int j = 0; j < n - i - 1; j++) {            // 只有当前面元素大于后面元素时才交换            // 相等时不交换,保证稳定性            if (arr[j] > arr[j + 1]) {                int temp = arr[j];                arr[j] = arr[j + 1];                arr[j + 1] = temp;            }        }    }}int main() {    int arr[] = {64, 34, 25, 12, 22, 11, 90, 34};    int n = sizeof(arr) / sizeof(arr[0]);    printf("排序前: ");    for (int i = 0; i < n; i++) {        printf("%d ", arr[i]);    }    printf("\n");    bubbleSort(arr, n);    printf("排序后: ");    for (int i = 0; i < n; i++) {        printf("%d ", arr[i]);    }    printf("\n");    return 0;}

运行结果:

排序前: 64 34 25 12 22 11 90 34 排序后: 11 12 22 25 34 34 64 90

注意:两个 34 在排序后依然保持了它们在原数组中的相对顺序(第一个 34 来自索引 1,第二个来自索引 7),这正是 稳定排序算法 的体现。

总结

通过本教程,你已经掌握了:

  • 什么是 C语言稳定排序
  • 为什么稳定性在某些场景下至关重要
  • 如何用 C 语言实现一个经典的 冒泡排序实现
  • 如何验证排序结果的稳定性

希望这篇 C语言排序教程 能帮助你打下坚实的算法基础!后续可以尝试实现插入排序或归并排序,进一步巩固对稳定排序的理解。