C语言实现冒泡排序:从基础到优化全解析

news/2024/12/5 19:05:52/

一、什么是冒泡排序?

冒泡排序(Bubble Sort)是一种经典的算法>排序算法,其工作原理非常直观:通过多次比较和交换相邻元素,将较大的元素“冒泡”到数组的末尾。经过多轮迭代,整个数组会变得有序。


二、冒泡排序的核心思想

  1. 比较相邻元素

    • 从数组的起始位置开始,逐个比较相邻的两个元素。
    • 如果顺序不符合(如升序时前一个元素大于后一个元素),则交换两者的位置。
  2. 逐步缩小范围

    • 每一轮结束后,当前未排序部分中最大的元素会移动到正确的位置。
    • 下一轮只需处理前面的未排序部分。

三、冒泡排序的实现步骤

  1. 从数组的第一个元素开始,与相邻元素进行比较。
  2. 如果顺序不对,交换这两个元素。
  3. 每轮操作后,将最大的元素固定在数组的最后。
  4. 重复上述步骤,直到数组完全有序。

四、冒泡排序的 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};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]

输出

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


六、复杂度分析

  1. 时间复杂度
    • 最坏情况(完全逆序):( O(n^2) )
    • 最好情况(已排序):( O(n^2) )(未优化情况下)。
  2. 空间复杂度
    • 只使用了常量空间,空间复杂度为 ( O(1) )。
  3. 稳定性
    • 冒泡排序是稳定的,因为它不会改变相等元素的相对顺序。

七、优化冒泡排序

1. 提前终止的优化

在某一轮比较中,如果没有发生交换,说明数组已经有序,可以提前结束排序。

void optimizedBubbleSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {int swapped = 0; // 标记变量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;swapped = 1; // 标记发生了交换}}if (!swapped) break; // 如果没有发生交换,提前结束}
}
2. 双向冒泡排序(鸡尾酒排序)

普通冒泡排序每轮只向一个方向“冒泡”,双向冒泡则在一轮中从两端同时冒泡,缩小范围。

void cocktailSort(int arr[], int n) {int swapped = 1;int start = 0, end = n - 1;while (swapped) {swapped = 0;// 从左向右冒泡for (int i = start; i < end; i++) {if (arr[i] > arr[i + 1]) {int temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;swapped = 1;}}if (!swapped) break;swapped = 0;end--;// 从右向左冒泡for (int i = end - 1; i >= start; i--) {if (arr[i] > arr[i + 1]) {int temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;swapped = 1;}}start++;}
}

八、优缺点分析

优点
  1. 实现简单:逻辑直观,代码易于编写和调试。
  2. 稳定性好:不会改变相等元素的相对顺序。
缺点
  1. 效率较低:时间复杂度较高,尤其对于大规模数据不适用。
  2. 优化潜力有限:即使优化后,性能仍不如快速排序或归并排序。

九、冒泡排序的适用场景

  1. 小规模数据排序:当数据量较小时,冒泡排序的性能尚可接受。
  2. 教学与学习:作为入门算法>排序算法,帮助理解排序的基本思想。
  3. 特殊情况下的稳定性需求:当需要保持相等元素的相对顺序时,可优先选择冒泡排序。

十、总结与建议

冒泡排序作为最基础的算法>排序算法,尽管效率较低,但其直观的实现方式非常适合初学者学习和理解算法>排序算法的核心思想。在实际应用中,建议结合优化方法(如提前终止、双向冒泡)以提升性能。

下一步学习方向

  1. 探索其他算法>排序算法(如插入排序、选择排序、快速排序)。
  2. 理解算法>排序算法的稳定性和复杂度,选择合适的算法解决实际问题。
  3. 实现冒泡排序的多种语言版本(如 Python、Java)。

http://www.ppmy.cn/news/1551280.html

相关文章

架构-微服务-服务配置

文章目录 前言一、配置中心介绍1. 什么是配置中心2. 解决方案 二、Nacos Config入门三、Nacos Config深入1. 配置动态刷新2. 配置共享 四、nacos服务配置的核心概念 前言 服务配置--Nacos Config‌ 微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相对分散。在一个…

【计算机操作系统】操作系统引论(学习笔记)

目录 操作系统的目标和作用 目标 作用 操作系统的发展过程 单道批 多道批 分时系统 实时系统 微机操作系统 嵌入式操作系统​编辑 网络操作系统​编辑 分布式操作系统 操作系统的基本特性 并发 共享 虚拟 异步 操作系统的运行环境 操作系内核​ 处理机的双…

你的网站真的安全吗?如何防止网站被攻击?

你的网站被黑客攻击过&#xff0c;很可能不止一次&#xff01; 这可不是危言耸听。微软最近发布了《2024 年微软数字防御报告》&#xff0c;报告中写到&#xff1a;“Windows 用户每天面临超过 6 亿次网络犯罪和国家级别的攻击&#xff0c;涵盖了从勒索软件到网络钓鱼再到身份…

DevExpress的web Dashboard应用

本文旨在从零开始创建一个包含dashboard的应用 一、前期准备 1、语言&#xff1a;C# 2、软件&#xff1a;Visual Studio 2019 3、框架&#xff1a;DevExpress19.2(付费)、ASP.NET(Web) 4、组件&#xff1a;dashboard 二、创建ASP.NET Web窗体仪表板应用程序 1、创建一个空的w…

istio中wasm插件是做什么的?

在 Istio 中&#xff0c;WASM 插件 是用来扩展和自定义数据平面&#xff08;即 Envoy Proxy&#xff09;行为的一种机制。它允许用户以更灵活、更高效的方式增强流量处理能力&#xff0c;而不需要修改 Envoy 的源码。以下是它的主要功能和应用场景&#xff1a; 1. 增强 Envoy …

Ubuntu WiFi检测

ubuntu检测到多个同名wifi&#xff0c;怎么鉴别假冒的wifi&#xff1f; 在Ubuntu中&#xff0c;如果检测到多个同名的Wi-Fi网络&#xff0c;可能存在假冒的Wi-Fi&#xff08;例如“蜜罐”攻击&#xff09;。以下是一些鉴别假冒Wi-Fi的方法&#xff1a; 检查信号强度&#xff1a…

Spring Cloud Gateway API 网关

Spring Cloud Gateway API 网关 一、Spring Cloud Gateway1.API 网关2.Gateway 核心概念3.工作流程 二、Gateway 路由1.断言 Predicate(1) 定义与作用(2) Route Predicate 工厂 2.动态路由 三、Gateway 过滤器1.局部过滤器(1) GatewayFilter 工厂 2.全局过滤器 一、Spring Clou…

【mac】mac自动定时开关机和其他常用命令,管理电源设置的工具pmset

一、操作步骤 1、打开终端 2、pmset 是用于管理电源设置的强大工具&#xff0c;我们将使用这个命令 &#xff08;1&#xff09;查询当前任务 pmset -g sched查看到我当前的设置是 唤醒电源开启在 工作日的每天早上8点半 上班时不用手动开机了 &#xff08;2&#xff09;删…