经典算法之冒泡排序(Bubble Sort)

简介: 经典算法之冒泡排序(Bubble Sort)

冒泡排序

      冒泡排序是一种比较简单的排序算法,我们可以重复遍历要排序的序列,每次比较两个元素,如果他们顺序错误就交换位置,重复遍历到没有可以交换的元素,说明排序完成。


算法原理

从第一个元素开始,比较相邻的两个元素,如果第一个大于第二个,则交换它们

对每一对相邻的元素做相同的操作,从第一对到最后一对,最终最后一位元素就是最大值

对每一个元素重复上述步骤,最后一个除外。

动图演示

497b8080573e43ccad0ff6f5c1fdb0b5.gif


算法练习

题目描述: 给定一个无序数组,利用冒泡排序将数组按升序排列。


示例一:


输入: arrs= [5,0,9,3,-1,12]
输出: arrs= [-1,0,3,5,9,12]

示例二:

输入: arrs= [3,5,9,7,2,1]
输出: arrs= [1,2,3,5,7,9]

解题思路:


通过比较相邻的元素,如果前一个比后一个大,则交换位置。


第一趟:比较第1个和第2个元素,然后是第2个和第3个比较,这样直到倒数第2个和最后1个,将最大的数移动到最后一位。

第二趟:重复上面步骤,将第二大的数交换至倒数第二位。

每一趟都会将元素中第 n 大的元素交换到倒数第 n 位。

一共需要n-1趟。

代码实现:

public class BubbleTest {
    public static void main(String[] args) {
        Integer[] arr = {3,5,9,7,2,1};
        Bubble.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    //数组排序
    public static void bubblesort(Comparable[] a){
        for (int i = a.length - 1;i > 0;i--){
            for (int j = 0;j < i;j++){
                if (greater(a[j],a[j + 1])){
                    swap(a,j,j + 1);
                }
            }
        }
    }
    //比较 v 是否大于 w
    public static boolean greater(Comparable v,Comparable w){
        return v.compareTo(w) > 0;
    }
    //数组元素交换位置
    private static void swap(Comparable[] a,int i,int j){
        Comparable temp;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

算法分析

时间复杂度

      冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算。

      而对于有n个元素的数列它的比较次数为 (n-1) + (n-2) + … + 1 = n * (n - 1) / 2;因此它的时间复杂度为O(n^2)。


空间复杂度

      冒泡排序的辅助变量只是一个临时变量,不会随数组规模的增大而增大,所以冒泡排序的空间复杂度为O(1)。


相关文章
|
11天前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
12 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
18天前
|
搜索推荐 算法 数据可视化
深入解析冒泡排序算法
深入解析冒泡排序算法
17 4
|
10天前
|
搜索推荐 C语言
排序算法--冒泡排序
排序算法--冒泡排序
9 0
|
15天前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
17天前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
16 0
|
2月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
27 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
2月前
|
搜索推荐 Java
经典排序算法---冒泡排序
这篇文章详细介绍了冒泡排序算法的基本思想、比较轮数和次数,并提供了Java语言实现冒泡排序的代码示例,展示了如何通过相邻元素的比较和交换来达到排序的目的。
经典排序算法---冒泡排序
|
3月前
|
算法 PHP
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
29 1
|
4月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
4月前
|
搜索推荐 算法 大数据
​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
​【数据结构与算法】冒泡排序:简单易懂的排序算法解析

热门文章

最新文章