C语言实现冒泡排序

  冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

  遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

算法步骤

  1. 开始:从第一个元素开始,比较相邻的两个元素。
  2. 交换:如果第一个元素大于第二个元素,则交换它们。
  3. 移动:移动到下一个元素,重复比较和交换。
  4. 遍历:直到最后一个元素,完成一轮排序。
  5. 重复:重复以上步骤,直到数列完全排序。

1.题目:使用数组 {64, 34, 25, 12, 22, 11, 90} 进行冒泡排序

  按照思想分析运行过程:

  已知数组为 {64, 34, 25, 12, 22, 11, 90}

  从加粗的第一组64和34开始

【1】第一轮

  比较 64 和 34,64>34,交换位置:

  34 64 25 12 22 11 90

  比较 64 和 25,64>25,交换位置:

34 25 64 12 22 11 90

  下面都同理,比较 64 和 12,交换位置:

34 25 12 64 22 11 90

  比较 64 和 22,交换位置:

34 25 12 22 64 11 90

  比较 64 和 11,交换位置:

34 25 12 22 11 64 90

  比较 64 和 90,64不大于90,不交换,第一轮结束。

【2】第二轮

  比较 34 和 25,交换位置:

25 34 12 22 11 64 90

  比较 34 和 12,交换位置:

25 12 34 22 11 64 90

  比较 34 和 22,交换位置:

25 12 22 34 11 64 90

  比较 34 和 11,交换位置:

25 12 22 11 34 64 90

  比较 34 和 64,不交换

【3】第三轮

  比较 25 和 12,交换位置:

12 25 22 11 34 64 90

  比较 25 和 22,交换位置:

12 22 25 11 34 64 90

  比较 25 和 11,交换位置:

12 22 11 25 34 64 90

  比较 25 和 34,不交换

【4】第四轮

  比较 12 和 22,不交换

  比较 22 和 11,交换位置:

12 11 22 25 34 64 90

【5】第五轮

  比较 12 和 11,交换位置:

11 12 22 25 34 64 90

2.代码实现:(算法部分)

void bubbleSort(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++) {
        int swapped;
        swapped = 0;
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1;
            }
        }
        if (swapped == 0) {
            break;
        }
    }
}

代码解释:

【1】相关参数:

  • int arr[] 是函数参数,表示要排序的数组。
  • int n 是函数参数,表示数组的长度。
  • i 用于控制外层循环,表示当前遍历到的数组元素的索引。
  • j 用于控制内层循环,表示在未排序部分的数组中进行比较的元素的索引。
  • temp 用于在交换元素时临时存储一个元素的值。
  • swapped 作为标记变量,用于检测在一轮内层循环中是否发生了元素交换。如果没有发生交换,则说明数组已经有序,可以提前结束排序。
  • 这里的n为数组元素个数,在主函数中定义为int n = sizeof(arr) / sizeof(arr[0]);

【2】部分代码详解

for (i = 0; i < n - 1; i++) {

  这段为外层循环,这部分是遍历数组用的,因为数组下标是从0开始的,遍历数组就是从0到n-1,从数组的第一个元素开始,最后一个元素n-1结束。数组arr为 {64, 34, 25, 12, 22, 11, 90},n为sizeof(arr) / sizeof(arr[0])即元素个数(数组长度)7,第一个元素64下标为0,最后一个90下标为6(也就是n-1)。

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

  这段为内层循环,这部分是用来弄每轮循环的,比如第一轮循环就是当i=0时候的情况,从 j = 0 开始,比较 arr[0] 和 arr[1],直到 arr[5] 和 arr[6],以此类推嘛~,循环条件是 j < 7 - 0 - 1 = 6j 的值从0到5嘛。因为循环体里面是arr[j] > arr[j + 1],就是比较到arr[5] 和 arr[6]了。

 swapped在这里 是一个标记变量,用于跟踪在内层循环中是否发生了元素交换。它的作用是优化冒泡排序算法,使得当数组已经是有序的时,可以提前结束排序过程,从而减少不必要的比较操作。在交换元素时,将 swapped 设置为1,如果 swapped 为0,表示在这一轮外层循环中没有发生任何交换,说明数组已经是有序的,可以提前结束排序。

3.代码结果:

4.完整代码:

#include"stdio.h"

int main(){
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("Original array: \n");
    printArray(arr, n);
    bubbleSort(arr, n);
    printf("Sorted array: \n");
    printArray(arr, n);
    return 0;
}

void bubbleSort(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++) {
        // 标记是否发生了交换
        int swapped;
        swapped = 0;
        for (j = 0; j < n - i - 1; j++) {
           //如果前一个大于后一个需要交换
             if (arr[j] > arr[j + 1]) {
                // 交换 arr[j] 和 arr[j + 1]
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1;
            }
        }
        // 如果在这一轮排序中没有发生任何交换,说明数组已经有序
        if (swapped == 0) {
            break;
        }
    }
}

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

相关推荐

  1. C语言实现冒泡排序

    2024-07-19 08:26:03       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 08:26:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 08:26:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 08:26:03       58 阅读
  4. Python语言-面向对象

    2024-07-19 08:26:03       69 阅读

热门阅读

  1. 数据结构讲解

    2024-07-19 08:26:03       20 阅读
  2. C++:类的定义和实例化

    2024-07-19 08:26:03       22 阅读
  3. NumPy库学习之logspace函数

    2024-07-19 08:26:03       22 阅读
  4. springMVC前后端请求参数绑定和传递

    2024-07-19 08:26:03       18 阅读
  5. C++中的socket编程常用接口

    2024-07-19 08:26:03       19 阅读
  6. Redis实现打卡功能

    2024-07-19 08:26:03       20 阅读
  7. 探索.NET内存之海:垃圾回收的艺术与实践

    2024-07-19 08:26:03       22 阅读
  8. 【.NET全栈】ASP.NET开发Web应用——Web部件技术

    2024-07-19 08:26:03       18 阅读
  9. 基于Gunicorn、Flask和Docker的高并发部署

    2024-07-19 08:26:03       20 阅读
  10. ArcGIS Pro SDK (九)几何 5 多边形

    2024-07-19 08:26:03       21 阅读
  11. SpringBoot集成EasyExcel实现模板写入多个sheet导出

    2024-07-19 08:26:03       21 阅读
  12. python中excel的读取和写入

    2024-07-19 08:26:03       20 阅读