引言

排序是计算机科学中最基础且重要的操作之一。在 C 语言编程领域,掌握常见的排序算法对于优化程序性能、处理大量数据等有着关键作用。本文将详细介绍两种简单且经典的排序算法 —— 冒泡排序和选择排序,并通过 C 语言代码实现它们。

冒泡排序

算法原理

冒泡排序(Bubble Sort)是一种简单的比较排序算法。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。这个过程就如同气泡在水中上升,较大的元素会逐渐 “浮” 到数列的末尾,因此得名。

C 语言代码实现

#include <stdio.h>

// 函数声明
void bubbleSort(int arr[], int n);

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    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;
}

// 冒泡排序函数定义
void bubbleSort(int arr[], int n) {
    int i, j;
    for (i = 0; i < n - 1; i++) {
        // 最后i个元素已经有序,所以内循环范围逐渐减小
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换arr[j]和arr[j + 1]
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

代码分析

在上述代码中,bubbleSort函数接受一个整数数组arr和数组的长度n作为参数。外层循环控制排序的轮数,一共需要n - 1轮。内层循环负责在每一轮中比较相邻的元素并进行交换。在每一轮结束后,最大的元素就会 “沉” 到数组的末尾。通过这样的方式,经过多轮比较和交换,整个数组就会有序。

选择排序

算法原理

选择排序(Selection Sort)也是一种简单直观的排序算法。它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

C 语言代码实现

#include <stdio.h>

// 函数声明
void selectionSort(int arr[], int n);

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原始数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    selectionSort(arr, n);

    printf("排序后的数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

// 选择排序函数定义
void selectionSort(int arr[], int n) {
    int i, j, 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) {
            // 交换arr[i]和arr[min_index]
            int temp = arr[i];
            arr[i] = arr[min_index];
            arr[min_index] = temp;
        }
    }
}

代码分析

selectionSort函数同样接受一个整数数组arr和数组长度n。外层循环控制选择的轮数,一共需要n - 1轮。在内层循环中,首先将当前外层循环的索引i设为最小元素的索引min_index,然后从i + 1位置开始遍历数组,找到最小元素的真实索引min_index。如果找到的最小元素索引不是当前的i,则交换这两个位置的元素。这样每一轮都能确定一个最小元素并放置在正确位置,最终完成整个数组的排序。

总结

冒泡排序和选择排序都是基础的排序算法,它们的时间复杂度在最坏和平均情况下都为 O (n²),空间复杂度为 O (1)。虽然在面对大规模数据时效率较低,但对于理解排序算法的基本思想和编程实现非常有帮助。在实际应用中,我们可以根据具体需求选择更高效的排序算法,如快速排序、归并排序等。希望本文能帮助你更好地理解和掌握 C 语言中的排序算法,为进一步的编程学习打下坚实基础。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐