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

排序算法 - 冒泡

文章目录

  • 1. 冒泡排序
    • 1.1 简介
    • 1.2 基本步骤:
      • 1.3 示例代码(C)
      • 1.4 复杂度分析
      • 1.5 动画展示

1. 冒泡排序

1.1 简介

冒泡排序(Bubble Sort)是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,把最大的元素逐步“冒泡”到列表的末尾。该算法的名称来源于较小的元素会逐渐“浮”到列表的顶端,而较大的元素则逐渐“沉”到列表的底部,就像气泡在水中上升和下沉一样。

1.2 基本步骤:

  1. 比较相邻元素:从列表的第一个元素开始,比较相邻的两个元素。如果前一个元素比后一个元素大,则交换它们的位置。

  2. 遍历列表:重复上述过程,直到列表的末尾。这一轮操作结束后,最大的元素会被移动到列表的最后一个位置。

  3. 重复步骤:再次从列表的第一个元素开始,重复上述过程,但这次不再包括最后一个已经排好的元素。

  4. 终止条件:重复上述步骤,直到整个列表有序(即没有需要交换的元素)。

1.3 示例代码(C)

#include <stdio.h>

// 冒泡排序函数
void bubbleSort(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n-1; i++) {
        // 提前退出标志,如果在一轮中没有发生交换,说明数组已经有序
        int 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;
        }
    }
}

// 打印数组函数
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.4 复杂度分析

  • 时间复杂度

    • 最优情况(列表已经有序):O(n),因为只需遍历一次就可以确定列表已经有序。
    • 最坏情况(列表完全逆序):O(n^2),因为每一轮都需要遍历整个列表,并且需要进行n-1次比较和交换。
    • 平均情况:O(n^2)
  • 空间复杂度:O(1),因为冒泡排序是原地排序,不需要额外的存储空间。

1.5 动画展示

bubble


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

相关文章:

  • WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等
  • Mysql数据库里的SSH连接
  • 微服务day07
  • 【C#设计模式(8)——过滤器模式(Adapter Pattern)】
  • 在Flutter中,禁止侧滑的方法
  • P8680 [蓝桥杯 2019 省 B] 特别数的和
  • Kubernetes实现故障转移和微服务弹性伸缩
  • 「Py」Python基础篇 之 Python都可以做哪些自动化?
  • 本地启动浏览器,并禁用web安全性,解决本地启动时,服务端强制要求https协议导致请求不通的问题
  • RabbitMQ的死信队列
  • UE5 HLSL 学习笔记
  • ISP——你可以从这里起步(二)
  • 基于微信小程序的农场管理系统的设计与实现,LW+源码+讲解
  • 通俗易懂:什么是 Java 类加载?
  • 多叉树笔记
  • Linux 如何使用函数删除非空目录
  • Android11 修改系统语言
  • P10901 [蓝桥杯 2024 省 C] 封闭图形个数
  • scala创建图书信息类,包含三个属性:书名,作者,价格
  • Spring Boot框架:电商系统的快速开发
  • arcgis做buffer
  • 学习threejs,使用导入的模型生成粒子
  • 扫雷游戏代码分享(c基础)
  • 观察者模式 vs 不使用观察者模式:商品库存变化的通知
  • Spring框架之责任链模式 (Chain of Responsibility Pattern)
  • GDSC、CTRP数据库学习