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

C 语言冒泡排序算法详解

目录

C 语言冒泡排序算法详解

引言

工作原理

示例代码

代码解释

时间复杂度和空间复杂度


C 语言冒泡排序算法详解

引言

冒泡排序是一种简单的排序算法,它通过重复地遍历要排序的列表,比较相邻的元素并根据需要交换它们的位置来实现排序。尽管冒泡排序的时间复杂度较高(O(n²)),但它因其简单易懂而常用于教学目的。本文将详细介绍冒泡排序的工作原理,并提供一个用 C 语言实现的示例。

工作原理

冒泡排序的基本思想是通过多次遍历待排序的列表,每次遍历时比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。这样,每遍历一次,最大的元素就会像气泡一样“浮”到列表的末尾。这个过程会重复进行,直到整个列表变得有序。

具体步骤如下:

  1. 初始化:设定一个外部循环,控制遍历次数。
  2. 内部遍历:设定一个内部循环,用于比较和交换相邻的元素。
  3. 比较和交换:在内部循环中,如果前一个元素大于后一个元素,则交换它们的位置。
  4. 重复:外部循环每执行一次,最大的未排序元素就会被移动到它最终的位置,内部循环的范围就会减少一个元素。
示例代码

下面是一个用 C 语言实现的冒泡排序示例:

#include <stdio.h>

// 冒泡排序函数
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]) {
                // 交换元素
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

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

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

    printf("原始数组: \n");
    printArray(arr, n);

    bubbleSort(arr, n);

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

    return 0;
}
代码解释
  1. 主函数 main

    • 定义一个整数数组 arr 并初始化。
    • 计算数组的长度 n
    • 打印原始数组。
    • 调用 bubbleSort 函数对数组进行排序。
    • 打印排序后的数组。
  2. 冒泡排序函数 bubbleSort

    • 使用两个嵌套的 for 循环来遍历数组。
    • 外部循环控制遍历次数。
    • 内部循环用于比较和交换相邻的元素。
    • 如果前一个元素大于后一个元素,则交换它们的位置。
  3. 打印数组函数 printArray

    • 遍历数组并打印每个元素。
    • 每打印完一个数组后换行。
时间复杂度和空间复杂度
  • 时间复杂度:冒泡排序的时间复杂度为 O(n²),其中 n 是数组的长度。这是因为冒泡排序需要进行 n-1 次遍历,每次遍历最多需要进行 n-1 次比较和交换。
  • 空间复杂度:冒泡排序的空间复杂度为 O(1),因为它只需要常数级的额外空间。

http://www.kler.cn/a/391892.html

相关文章:

  • Nuxt 版本 2 和 版本 3 的区别
  • STM32单片机WIFI语音识别智能衣柜除湿消毒照明
  • springboot 之 整合springdoc2.6 (swagger 3)
  • 第三十六章 Vue之路由重定向/404页面设置/路径模式设置
  • 《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信
  • arkUI:遍历数据数组动态渲染(forEach)
  • 二叉树的练习题(中)
  • 【蓝桥杯 2021 省 B2】特殊年份
  • 如何优化Kafka消费者的性能
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十三:将AVFrame转换成AVPacket。视频编码原理.编码相关api
  • 【微服务设计】分布式系统一致性:深入解析2PC(两阶段提交)和TCC的优势与劣势
  • wordpress搭建主题可配置json
  • springboot中返回数据脱敏
  • FFmpeg将mp4的文件转化为m4a
  • Spring Boot编程训练系统:构建可扩展的应用
  • 网络安全-Linux基础(bash脚本)
  • 【设计模式系列】享元模式(十五)
  • RabbitMQ 与 PHP Swoole 实现
  • 期权懂|期权新手入门教学:期权合约有哪些要素?
  • 容器技术在持续集成与持续交付中的应用
  • (附项目源码)Java开发语言,springboot 乳腺癌术后中医健康管理APP 56,计算机毕设程序开发+文案(LW+PPT)
  • C/C++基础知识复习(18)
  • 【C语言】结构体大小计算
  • 机器学习、深度学习面试知识点汇总
  • 三星手机投屏到MacBook的方法,多台手机同屏展示
  • 【MyBatis源码】SQL 语句构建器AbstractSQL