目录
冒泡排序的工作原理
第一次迭代
后续迭代
冒泡排序的实现
优化的冒泡排序
冒泡排序的复杂度
时间复杂度:
最佳情况 (O(n)):
平均情况 (O(n²)):
最坏情况 (O(n²)):
空间复杂度 O(1):
结论
首页 Java java教程 了解冒泡排序算法(附Java示例)

了解冒泡排序算法(附Java示例)

Jan 18, 2025 am 02:14 AM

Bubble Sort详解:一个简单的排序算法

冒泡排序是最简单的排序算法之一。它的工作原理是反复比较相邻元素,如果它们顺序不对,则交换它们。例如,如果排序顺序是升序,则比较相邻元素,并将较大的元素放在右边。每次迭代中,我们只比较未排序的元素,并将最大的元素放在数组未排序元素的最后一个位置。

该算法恰如其分地命名为冒泡排序,因为元素在每次迭代中都向数组的右侧移动,就像水泡上升到水面一样。

冒泡排序的工作原理

假设我们要按升序排列这个数组:

Understanding Bubble Sort Algorithm (with Examples in Java)

第一次迭代

在第一次迭代中,我们尝试将最大元素移动到数组的末尾。因此,我们将重复比较相邻元素,如果它们顺序不对,则交换它们。

Understanding Bubble Sort Algorithm (with Examples in Java)

已移动到正确位置的元素被认为已排序。

后续迭代

这个过程对所有迭代重复进行,直到数组排序完毕。在每次迭代中,我们只比较未排序的元素,因为已排序的元素已经按正确的顺序排列。

Understanding Bubble Sort Algorithm (with Examples in Java)

我们迭代遍历数组 n-1 次,其中 n 是数组的长度。也就是说,由于我们的数组有六个元素,我们只迭代遍历数组五次。这是因为,在第五次迭代之后,五个元素已经放置在其正确的位置,因此最终的未排序元素被认为已排序。所有迭代完成后,我们将得到一个排序后的数组。

冒泡排序的实现

public class BubbleSortTest {
    public static void main(String[] args) {
        int[] arr = {8, 2, 6, 4, 9, 1};
        System.out.println("未排序数组: " + Arrays.toString(arr));
        bubbleSort(arr);
        System.out.println("已排序数组: " + Arrays.toString(arr));
    }

    public static void bubbleSort(int[] arr) {
        int size = arr.length;

        // 循环遍历数组 size-1 次
        for (int i = 0; i < size - 1; i++) {
            // 比较相邻元素
            for (int j = 0; j < size - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}
登录后复制

运行此代码将在控制台中打印以下输出:

<code>未排序数组: [8, 2, 6, 4, 9, 1]
已排序数组: [1, 2, 4, 6, 8, 9]</code>
登录后复制

在这个冒泡排序的实现中,即使数组已经排序,我们也会每次都迭代遍历数组。我们可以进一步优化代码,以便一旦数组已排序就停止排序。

优化的冒泡排序

public static void bubbleSortOptimised(int[] arr){
    int size = arr.length;
    boolean swapped;

    // 循环遍历数组 size-1 次
    for (int i = 0; i < size - 1; i++) {
        swapped = false;
        // 比较相邻元素
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j+1]){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;

                swapped = true;
            }
        }

        // 如果没有交换,则数组已排序
        if(!swapped) break;
    }
}
登录后复制

通过这个实现,如果我们尝试对一个已经排序的数组进行排序,我们将只迭代一次,并在没有进行排序时停止。

冒泡排序的复杂度

时间复杂度:

最佳情况 (O(n)):

最佳情况是输入数组已经排序。算法只迭代一次数组以检查它是否已排序,并且不执行任何交换。

平均情况 (O(n²)):

当输入数组元素处于随机顺序时。算法必须进行多次迭代并执行交换以对数组进行排序。

最坏情况 (O(n²)):

最坏情况是输入数组按反向顺序排序。算法进行 n-1 次迭代并执行最大数量的交换。

空间复杂度 O(1):

冒泡排序是一种就地排序算法,也就是说,它不需要任何与输入数组大小成比例的额外内存。

结论

冒泡排序是一种易于理解和实现的算法。但是,由于其时间复杂度高,因此不适合用于处理大型数据集。在处理小型数据集时,或者当你不关心复杂度时,可以使用冒泡排序。

以上是了解冒泡排序算法(附Java示例)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Java的类负载机制如何起作用,包括不同的类载荷及其委托模型? Java的类负载机制如何起作用,包括不同的类载荷及其委托模型? Mar 17, 2025 pm 05:35 PM

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存? 如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存? Mar 17, 2025 pm 05:44 PM

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射? 如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射? Mar 17, 2025 pm 05:43 PM

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案? 如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案? Mar 17, 2025 pm 05:46 PM

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)? 如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)? Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

See all articles