正在载入交互式动画窗口请稍等

冒泡排序 可视化交互式动画版

图码-数据结构可视化动画版

冒泡排序 是最简单的 排序算法 ,如果相邻元素的顺序错误,它的工作原理是重复交换相邻元素。 该算法不适合大型数据集,因为其平均和最坏情况时间复杂度相当高。

冒泡排序算法

在这个算法中, 

  • 从左侧遍历,比较相邻元素,较高的放在右侧。 
  • 这样,最大的元素首先被移动到最右端。 
  • 然后继续这个过程,找到第二大的并放置它,依此类推,直到数据排序完毕。

冒泡排序是如何工作的?

让我们借助下图来了解冒泡排序的工作原理:

输入: arr[] = {6, 3, 0, 5}

第一关:  

最大的元素被放置在正确的位置,即数组的末尾。

冒泡排序算法:将最大的元素放在正确的位置

冒泡排序算法:将最大的元素放在正确的位置

第二遍:  

将第二大元素放在正确的位置

冒泡排序算法:将第二大元素放在正确的位置

冒泡排序算法:将第二大元素放在正确的位置

第三遍:

将其余两个元素放置在正确的位置。

冒泡排序算法:将剩余元素放置在正确的位置

冒泡排序算法:将剩余元素放置在正确的位置

  • 总数 通过次数: n-1
  • 总数 比较次数: n*(n-1)/2

冒泡排序的实现

下面是冒泡排序的实现。 如果内部循环没有引起任何交换,可以通过停止算法来优化它。 

C++

// Optimized implementation of Bubble sort
#include <bits/stdc++.h>
using namespace std;
 
// An optimized version of Bubble Sort
void bubbleSort(int arr[], int n)
{
    int i, j;
    bool swapped;
    for (i = 0; i < n - 1; i++) {
        swapped = false;
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
                swapped = true;
            }
        }
 
        // If no two elements were swapped
        // by inner loop, then break
        if (swapped == false)
            break;
    }
}
 
// Function to print an array
void printArray(int arr[], int size)
{
    int i;
    for (i = 0; i < size; i++)
        cout << " " << arr[i];
}
 
// Driver program to test above functions
int main()
{
    int arr[] = { 64, 34, 25, 12, 22, 11, 90 };
    int N = sizeof(arr) / sizeof(arr[0]);
    bubbleSort(arr, N);
    cout << "Sorted array: \n";
    printArray(arr, N);
    return 0;
}
// This code is contributed by shivanisinghss2110


            

C

Java

Python3

C#

JavaScript

PHP

输出

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

冒泡排序的复杂度分析

时间复杂度: O(N 2 )
辅助空间: O(1)

冒泡排序的优点:

  • 冒泡排序很容易理解和实现。
  • 它不需要任何额外的内存空间。
  • 它是一种稳定的排序算法,这意味着具有相同键值的元素在排序输出中保持其相对顺序。

冒泡排序的缺点:

  • 冒泡排序的时间复杂度为 O(N 2 ),这使得它对于大型数据集非常慢。
  • 冒泡排序是一种基于比较的排序算法,这意味着它需要比较运算符来确定输入数据集中元素的相对顺序。 在某些情况下它会限制算法的效率。

与冒泡排序相关的一些常见问题:

冒泡排序的边界情况是什么?  

当元素已排序时,冒泡排序所需的时间最少(n 阶)。 因此,最好事先检查数组是否已经排序,以避免 O(N 2 ) 时间复杂度。

冒泡排序中排序是否就地进行?

是的,冒泡排序在不使用任何主要数据结构的情况下执行相邻对的交换。 因此,冒泡排序算法是一种就地算法。

冒泡排序算法稳定吗?

是的,冒泡排序算法是稳定的。

冒泡排序算法用在哪里?

由于其简单性,冒泡排序经常被用来引入排序算法的概念。 在计算机图形学中,它因其能够检测几乎排序的数组中的微小错误(例如仅两个元素的交换)并仅用线性复杂度(2n)来修复它而广受欢迎。 

示例:它用于多边形填充算法,其中边界线按特定扫描线(平行于 x 轴的线)处的 x 坐标排序,并且随着 y 的增加,它们的顺序仅发生变化(两个元素交换)在两条线的交点处(来源: 维基百科

相关文章:  

  • 递归冒泡排序
  • 排序的编码练习
  • 冒泡排序测验
  • 冒泡排序的复杂度分析

无论你的目标是考试成功、职业发展,还是纯粹的兴趣,这个数据结构和算法可视化的网站都会是一个无价的资源。

前往这个网站,开始你的学习之旅吧!

这些是常见的:【C语言描述】《数据结构和算法》数据结构JAVA实现 数据结构与算法基础(青岛大学-王卓)数据结构与算法王道数据结构c语言实现 速成数据结构期末考前救急 数据结构视频C语言版教程 数据结构严蔚敏 数据结构郝斌 数据结构考研 JAVA数据结构算法与基础 数据结构王道 2022数据结构学习 数据结构小甲鱼 王卓 学习数据结构 数据结构浙江大学 数据结构复习 数据结构马士兵 数据结构零基础教程 数据结构和算法 数据结构入门 考研数据结构习题讲解 数据结构期末复习 计算机二级