Demonstração Animada de Bubble Sort Visualize seu código com animações

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

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

冒泡排序算法

在这个算法中, 

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

冒泡排序是如何工作的?

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

输入: 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 的增加,它们的顺序仅发生变化(两个元素交换)在两条线的交点处(来源: 维基百科

相关文章:  

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

Seja seu objetivo o sucesso em exames, o desenvolvimento profissional ou o puro interesse, este site de visualização de estruturas de dados e algoritmos será um recurso inestimável.

Acesse este site e comece sua jornada de aprendizado!

Estes são os comuns: [Descrição em C] Estruturas de Dados e Algoritmos Implementação de Estruturas de Dados em JAVA Fundamentos de Estruturas de Dados e Algoritmos (Universidade de Qingdao - Wang Zhuo) Estruturas de Dados e Algoritmos Caminho Real das Estruturas de Dados Implementação em C das Estruturas de Dados Curso Intensivo de Estruturas de Dados para Salvar a Prova Final Tutorial em Vídeo de Estruturas de Dados em C Versão em C do Livro de Yan Weimin Estruturas de Dados Hao Bin Estruturas de Dados para Pós-Graduação Algoritmos e Fundamentos de Estruturas de Dados em JAVA Caminho Real das Estruturas de Dados 2022 Aprendizado de Estruturas de Dados Pequena Tartaruga das Estruturas de Dados Wang Zhuo Aprendendo Estruturas de Dados Estruturas de Dados da Universidade de Zhejiang Revisão de Estruturas de Dados Soldado Ma das Estruturas de Dados Curso Zero de Estruturas de Dados Estruturas de Dados e Algoritmos Introdução às Estruturas de Dados Explicação de Exercícios de Estruturas de Dados para Pós-Graduação Revisão Final de Estruturas de Dados Nível 2 de Computação