首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >排序算法之冒泡排序

排序算法之冒泡排序

作者头像
用户11397231
发布2024-12-10 19:22:12
发布2024-12-10 19:22:12
26200
代码可运行
举报
文章被收录于专栏:算法算法
运行总次数:0
代码可运行

冒泡排序思路

冒泡排序是一种简单的排序算法,它通过重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序示例

待排序数组:3,9,-1,10,20

第一轮排序:
  1. (1)3,9,-1,10,20 ----3跟9比较,不交换
  2. (2)3,-1,9,10,20 ----9比 -1大,所以9跟 -1交换
  3. (3)3,-1,9,10,20 ----9跟10比较,不交换
  4. (4)3,-1,9,10,20 ----10跟20比较,不交换

第一轮过后,将20这个最大的元素固定到了最后的位置。

第二轮排序:

因为20的位置已经固定,所以只对前4个进行排序即可:

  1. (1)-1,3,9,10,20 ----3比 -1大,进行交换
  2. (2)-1,3,9,10,20 ----3跟9比较,不交换
  3. (3)-1,3,9,10,20 ----9跟10比较,不交换

第二轮过后,将第二大的元素固定到了倒数第二个位置

第三轮排序:

10和20的位置已经确定,只需对前三个进行排序

  1. (1)-1,3,9,10,20 ----3和-1比较,不交换
  2. (2)-1,3,9,10,20 ----3和9比较,不交换

第三轮过后,将第三大的元素位置确定

第四轮排序:

只对前两个元素进行排序

  1. (1)-1,3,9,10,20 ----3和-1比较,不交换

第四轮过后,将第四大的元素位置确定,此时总共5个元素,已经排序好4个,从而最后一个自然而然就是排好序的了

冒泡排序的优化

冒泡排序可以通过一些技巧进行优化,以减少不必要的比较和交换:

  1. 设立标志位:在每一轮排序中,如果发生了交换,则设置一个标志位为true。如果在某一轮排序中没有发生任何交换,则说明数组已经有序,可以提前结束排序。
  2. 减少不必要的遍历:由于每个元素在每轮排序中最多只能向前移动一位,因此在一轮排序后,最后一个元素已经是当前未排序部分的最大值。因此,在下一轮排序时,可以减少一个比较,因为最后一个元素已经到位。

冒泡排序的算法分析

冒泡排序的时间复杂度和空间复杂度如下:

  • 时间复杂度:平均和最坏情况都是O(N^2),最好情况是O(N)(当输入数组已经是有序的)。
  • 空间复杂度:O(1),冒泡排序是原地排序,不需要额外的存储空间。

冒泡排序的适用场景

冒泡排序适用于以下场景:

  1. 数据量小:当数据量非常小的时候,冒泡排序的低时间复杂度优势可以体现出来。
  2. 基本有序的数据:如果输入的数据已经是基本有序的,冒泡排序可以很快完成排序。
  3. 教学目的:由于其简单直观的特性,冒泡排序常用于教学中,帮助初学者理解排序算法的基本概念。

冒泡排序与其他排序算法的比较

与其他常见的排序算法相比,冒泡排序有以下特点:

  1. 简单性:冒泡排序的算法逻辑非常简单,容易理解和实现。
  2. 稳定性:冒泡排序是稳定的排序算法,可以保持相等元素的相对顺序。
  3. 速度:在小规模数据或基本有序的数据集中,冒泡排序的速度可以非常快。
  4. 适应性:冒泡排序可以很容易地适应于各种数据集,包括部分有序的数据集。

冒泡排序的变种

冒泡排序有一些变种,可以提高其效率:

  1. 鸡尾酒排序(Cocktail Sort):又称双向冒泡排序,它在冒泡排序的基础上,增加了从后向前的遍历,以提高排序效率。
  2. Shell排序:是冒泡排序的一种改进,它允许交换相距一定间隔的元素,可以看作是冒泡排序的优化版本。

冒泡排序的代码实现

以下是冒泡排序的C语言实现:

代码语言:javascript
代码运行次数:0
运行
复制
#include<stdio.h>

void swap(int* a, int* b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

//冒泡排序
void BubbleSort(int* a, int n) {
    int end = n - 1;
    while(end) {
        int exchange = 0;
        for (int i = 0; i < end; i++) {
            if (a[i] > a[i + 1]) {
                swap(&a[i], &a[i + 1]);
                exchange = 1;
            }
        }
        if (exchange == 0) break;
        end--;
    }
}

int main() {
    int arr[] = {3, 9, -1, 10, 20};
    int n = sizeof(arr) / sizeof(arr[0]);
    BubbleSort(arr, n);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

总结

冒泡排序是一种简单直观的排序算法,适合于数据量不大或基本有序的数据集。虽然其平均和最坏情况的时间复杂度都是O(N^2),但在数据量小或部分有序的情况下,冒泡排序可以很快完成排序。此外,冒泡排序是稳定的排序算法,可以保持相等元素的相对顺序。在实际应用中,可以根据数据特点和性能要求选择合适的排序算法。尽管冒泡排序在大规模数据集上的性能不如其他更高级的排序算法,如快速排序、归并排序等,但它的教育意义和在特定场景下的实用性不容忽视。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 冒泡排序思路
  • 冒泡排序示例
    • 第一轮排序:
    • 第二轮排序:
    • 第三轮排序:
    • 第四轮排序:
  • 冒泡排序的优化
  • 冒泡排序的算法分析
  • 冒泡排序的适用场景
  • 冒泡排序与其他排序算法的比较
  • 冒泡排序的变种
  • 冒泡排序的代码实现
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档