排序算法之冒泡排序(图解)

图文解释冒泡排序 冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序。它会遍历若干次需要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止! 阅读详情

1.冒泡排序

wikipedia:

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

为什么介绍用“浮”呢?看它的动图应该就可以理解了。

Bubble_sort_animation.gif

总结一下就是:比较相邻的两个元素然后交换这两者,一直到一整个数列都按照顺序排列。

2.冒泡排序的步骤

可以先看动图,如果动图就能够理解的话,就不需要看下面的步骤了。
bubbleSort.gif

如果觉得动图太快,可以按照下面的步骤一步步理解。

第一次迭代

  1. 从第一个下标开始,也就是0,比较第一个和第二个元素。
  2. 如果第一个元素比第二个元素大,那就交换两者。
  3. 然后比较第二个元素和第三个元素,如果两者也不是升序,那交换两者。
  4. 一直比较和交换,直到最后。

Bubble-sort-0.webp

之后的迭代

冒泡排序就是不断重复迭代的过程,随着不断的交换,大的元素会和动图一样交换到后面,小的元素则会换到前面。下图是第二次迭代。

Bubble-sort-2.webp

下图是最后一次迭代,当-2和-9交换后,这一整个数组的排序就完成了。

Bubble-sort-3.webp

3.冒泡排序的实现

伪代码

function bubble_sort (array, length) {
    var i, j;
    for(i from 0 to length-1){
        for(j from 0 to length-1-i){
            if (array[j] > array[j+1])
                swap(array[j], array[j+1])
        }
    }
}

助记码

i∈[0,N-1)               //循环N-1遍
   j∈[0,N-1-i)           //每遍循环要处理的无序部分
     swap(j,j+1)          //两两排序(升序/降序)

Python

# Bubble sort in Python

def bubbleSort(array):
    
  # loop to access each array element
  for i in range(len(array)):

    # loop to compare array elements
    for j in range(0, len(array) - i - 1):

      # compare two adjacent elements
      # change > to < to sort in descending order
      if array[j] > array[j + 1]:

        # swapping elements if elements
        # are not in the intended order
        temp = array[j]
        array[j] = array[j+1]
        array[j+1] = temp


data = [-2, 45, 0, 11, -9]

bubbleSort(data)

print('Sorted Array in Ascending Order:')
print(data)

Java

// Bubble sort in Java

import java.util.Arrays;

class Main {

  // perform the bubble sort
  static void bubbleSort(int array[]) {
    int size = array.length;
    
    // loop to access each array element
    for (int i = 0; i < size - 1; i++)
    
      // loop to compare array elements
      for (int j = 0; j < size - i - 1; j++)

        // compare two adjacent elements
        // change > to < to sort in descending order
        if (array[j] > array[j + 1]) {

          // swapping occurs if elements
          // are not in the intended order
          int temp = array[j];
          array[j] = array[j + 1];
          array[j + 1] = temp;
        }
  }

  public static void main(String args[]) {
      
    int[] data = { -2, 45, 0, 11, -9 };
    
    // call method using class name
    Main.bubbleSort(data);
    
    System.out.println("Sorted Array in Ascending Order:");
    System.out.println(Arrays.toString(data));
  }
}

C

// Bubble sort in C

#include <stdio.h>

// perform the bubble sort
void bubbleSort(int array[], int size) {

  // loop to access each array element
  for (int step = 0; step < size - 1; ++step) {
      
    // loop to compare array elements
    for (int i = 0; i < size - step - 1; ++i) {
      
      // compare two adjacent elements
      // change > to < to sort in descending order
      if (array[i] > array[i + 1]) {
        
        // swapping occurs if elements
        // are not in the intended order
        int temp = array[i];
        array[i] = array[i + 1];
        array[i + 1] = temp;
      }
    }
  }
}

// print array
void printArray(int array[], int size) {
  for (int i = 0; i < size; ++i) {
    printf("%d  ", array[i]);
  }
  printf("\n");
}

int main() {
  int data[] = {-2, 45, 0, 11, -9};
  
  // find the array's length
  int size = sizeof(data) / sizeof(data[0]);

  bubbleSort(data, size);
  
  printf("Sorted Array in Ascending Order:\n");
  printArray(data, size);
}

C++

// Bubble sort in C++

#include <iostream>
using namespace std;

// perform bubble sort
void bubbleSort(int array[], int size) {

  // loop to access each array element
  for (int step = 0; step < size; ++step) {
      
    // loop to compare array elements
    for (int i = 0; i < size - step; ++i) {

      // compare two adjacent elements
      // change > to < to sort in descending order
      if (array[i] > array[i + 1]) {

        // swapping elements if elements
        // are not in the intended order
        int temp = array[i];
        array[i] = array[i + 1];
        array[i + 1] = temp;
      }
    }
  }
}

// print array
void printArray(int array[], int size) {
  for (int i = 0; i < size; ++i) {
    cout << "  " << array[i];
  }
  cout << "\n";
}

int main() {
  int data[] = {-2, 45, 0, 11, -9};
  
  // find array's length
  int size = sizeof(data) / sizeof(data[0]);
  
  bubbleSort(data, size);
  
  cout << "Sorted Array in Ascending Order:\n";  
  printArray(data, size);
}

4.冒泡排序的复杂度

时间复杂度
最优O(n)
最坏O( n 2 n^2 n2)
平均O( n 2 n^2 n2)
空间复杂度O(1)
稳定性Yes

平均复杂度的计算

循环比较的次数
1st(n-1)
2nd(n-2)
3rd(n-3)
last1

所以,比较的次数是

(n-1) + (n-2) + (n-3) +.....+ 1 = n(n-1)/2

基本上等于 n 2 n^2 n2

【八大排序】冒泡排序 | 快速排序 + 图文详解!! 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。 阅读详情

相关推荐

小学生图解排序算法:①冒泡排序

冒泡排序是一种计算机科学领域的较简单的排序算法。名字由来是因为越大的元素会经典交换慢慢“浮”到数列的顶端,故名。

纯文笔记 2030

数据结构:冒泡排序

这个算法是通过「交换标记(swapped)」检测数组是否提前有序,一旦有序就立即终止循环,避免执行后续所有无效的轮次,这是它最核心的优势。核心思路记录每一轮最后一次发生交换的位置,这个位置之后的元素已经是有序的,下一轮只需比较到这个位置即可,从而大幅缩小每一轮的比较范围,进一步减少内层循环次数。/** 冒泡排序优化版2:记录最后交换位置,缩小比较范围*/#include<assert.h>//assert()的头文件assert(arr!=NULL);// 确保数组非空return;

2401_86628113的博客 472

冒泡排序(超详细)

1、什么是冒泡排序冒泡排序的英文Bubble Sort,是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。 冒泡排序的原理: 每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作。 而 “每一趟 ” 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后向后挪一位继续比较下面

hcz666的博客 39万+

漫画:什么是冒泡排序

————— 当天上午 —————什么是冒泡排序冒泡排序的英文Bubble Sort,是一种最基础的交换排序。大家一定都喝过汽水,汽水中常常有许多小小的气泡,哗啦哗啦...

CSDN资讯 6524

冒泡排序详解(Bubble Sort)

构造的过程就是将无序的序列构造成一个堆的过程。堆的定义是:对于任意一个非叶子节点 i,其左子节点为 2i+1,右子节点为 2i+2,且父节点的值大于等于(或小于等于)其子节点的值。因此,我们可以从最后一个非叶子节点开始,依次将其与其子节点比较,如果不满足堆的定义,则交换位置,直到整个序列构造成一个堆为止。排序的过程就是将堆顶元素与最后一个元素交换位置,然后将剩余元素重新构造成一个堆的过程。每次交换后,堆的大小减一,因此我们可以通过一个变量来记录堆的大小,从而将排序的过程限制在堆的范围内。

Wzill 1万+

图解算法排序算法(1)——冒泡排序

凯哥大数据——刘凯的博客 221

图解排序算法冒泡排序

排序算法冒泡排序 什么是冒泡排序 众所周知冒泡排序时相对简单的一种排序方式,其中冒泡排序的思路也是同他的名字一样,像水中的气泡咕噜咕噜一样,较大的气泡(元素)通过翻越一个个障碍(小元素)率先浮出水面,每一个气泡依次这个思路,最终我们的数组的排序就得以完成 冒泡思路 采用双层循环进行冒泡排序 外循环 依次对 N-1个元素进行冒泡。注意:存在N个元素的数组,若前N-1个排序完成那么最后一个也一定...

超级小四 293

python冒泡算法排序算法_图解冒泡排序算法|python基础教程|python入门|python教程...

https://www.xin3721.com/eschool/pythonxin3721/图解冒泡排序冒泡排序是常用排序算法中最简单的一种,可能很多同学看到这个标题之后就会很不屑的说,冒泡排序谁不会吖,你还在这里献丑!我就献丑了,怎么了!我骄傲了吗?还不会的同学好好看了,以后你也可以在别人面前说,连冒泡排序都不会退出程序界啦。基于这个背景衍生了一个排序算法鄙视链。排序算法鄙视链:写冒泡的鄙视不会...

weixin_39620578的博客 132

重温经典排序算法冒泡排序——图解+C/C++实现

目录1.冒泡排序算法原理:2.算法性能分析:(1)时间复杂度(2)算法稳定性3.图解分析4.C/C++实现 1.冒泡排序算法原理: 【说明】这里实现的冒泡排序算法均为从小到大排序 1.比较相邻的元素,如果第一个比第二个大,就交换他们; 2.第一趟排序:第一个和第二个比较,若前者比后者大则交换;第二个和第三个比较满足前者较大则交换;随后依次进行相邻两个数的比较与交换,直到最后一对。第一趟排序结束后,...

SAMSARA的博客 6551

图解排序算法之「冒泡排序」(详细解析)

冒泡排序(Bubble Sort)是最基础的排序算法之一,它的核心思想是:多次遍历要排序的序列,在遍历的过程中,当发现两个相邻的元素逆序,就交换这两个元素的位置,直到某次遍历不需要交换元素为止。

Veggie的博客 2万+

排序算法图解(一):冒泡排序冒泡排序的优化

冒泡排序(Bubble Sorting)即:通过对待排序的序列从前往后,依次比较相邻元素的值,若发现逆序则交换位置,使较大的元素逐渐移动到后部,就像水底的气泡一样逐渐从水面冒出来,这就是冒泡名称的由来。

黄小黄的博客 1119

排序算法——冒泡排序图解+代码)

文章目录冒泡排序1. 图解冒泡排序2. C语言实现针对数组本身有序 冒泡排序 遍历数组,从前往后进行比较,每次都将最大的数字交换至最后,并减少比较长度。 从小到大进行排序 时间复杂度O( n2 ) 空间复杂度O( 1 ),稳定 1. 图解冒泡排序 1、遍历数组, arr[i] 从第1个数字到倒数第二个数字len-1。 2、首先定义第三方变量 tmp 用于数字的交换。 3、每次都从第1数字(下标0)开始一直到已完成排序的数字之前的位置即下标len-1-i,将 j 下标的值(即 arr[ j ])和它

qq_22108657的博客 3318

排序算法图解冒泡排序(多图+解决两种无效比较问题)

本文主要介绍冒牌排序算法,通过图片一步步解释每一趟每一次的交换。并且,本文在给出冒泡排序基础版代码后,分析了基础版存在的两个问题,解决该问题可以避免出现不必要的比较。代码通过C#实现,并输出每一次交换的情况和比较次数,方便各位小伙伴比较算法的优缺点。......

baidu_33146219的博客 2万+

常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)

 常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序) 冒泡排序算法: 总的来说就是两两交换,反复直到有序,第一个记录和第二个记录,若逆序则交换,然后比较第二个和第三个记录,以此类推,直到第 n 个记录和第 n-1个记录比较完毕为止,第一趟排序,结果关键字最大的记录被安排在最后一个位置。对前 n-1个记录继续冒泡排序,使得关键字次大的记录安排在第 n-1个位置。如

jia1506的博客 848

图解排序算法之选择,插入,冒泡排序

https://www.cnblogs.com/chengxiao/p/6103002.html 简单选择排序 简单选择排序是最简单直观的一种算法,基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。 在算法实现时,每一趟确定最小元素的时候会通过不断地比较交换来使得首位置为当前最小,交换是个比较耗时的操作。其实我们很容易发...

HAH--M的博客 206

排序算法-交换排序算法冒泡排序图解、实现与优化(java)

用java来实现冒泡排序

没有简介就是简介 367

[排序算法]1.图解冒泡排序及其代码实现

从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置

大象不下象棋的博客 517
上一篇: leetcode刷题 75. 颜色分类,Medium(Java)计数法+单指针+双指针*2
下一篇: 4个视频看懂红黑树
Sueko
博客等级 码龄9年 47粉丝 67原创
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值