버블 정렬 애니메이션 데모 애니메이션으로 코드를 시각화하세요

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

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

冒泡排序算法

在这个算法中, 

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

冒泡排序是如何工作的?

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

输入: 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 데이터 구조 학습 데이터 구조 샤오자위 왕줘 데이터 구조 학습 데이터 구조 저장 대학 데이터 구조 복습 데이터 구조 마사빙 데이터 구조 기초 제로 데이터 구조와 알고리즘 데이터 구조 입문 대학원 시험 데이터 구조 문제 풀이 설명 데이터 구조 기말 복습 컴퓨터 2급