Java排序之冒泡排序的实现与优化

Java排序之冒泡排序的实现与优化

冒泡排序基本原理

冒泡排序是一种简单的排序算法,其基本思想是通过比较相邻的元素,将较大的数交换到右边,较小的数交换到左边。这样每一轮交换后,未排序的数列中的最大元素就被移动到了最右边,因此被称为“冒泡排序”。

基本算法实现

下面是基本的冒泡排序算法实现:

public static void bubbleSort(int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

其中,外层循环控制轮数,内层循环控制每轮的比较和交换。每一轮内层循环结束后,未排序的部分的最大值已经被移到了正确的位置。

优化算法实现

虽然冒泡排序是一种简单易懂的算法,但是其时间复杂度为O(n^2),比较和交换的次数非常多,效率很低。因此,对其进行优化就显得尤为重要。

一、优化循环次数

我们可以在循环内部记录一个标志变量,表示是否进行了交换,如果没有进行交换,说明序列已经有序,直接退出循环,这样可以减少循环次数。

public static void bubbleSort(int[] arr) {
    boolean flag = true;
    for (int i = 0; i < arr.length - 1 && flag; i++) {
        flag = false;
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                flag = true;
            }
        }
    }
}

二、优化比较次数

我们可以在内层循环中记录最后一次交换的位置,之后的比较都不需要考虑这个位置以后的元素,这样可以减少比较次数。

public static void bubbleSort(int[] arr) {
    int lastSwapIndex = arr.length - 1;
    while (lastSwapIndex > 0) {
        int k = lastSwapIndex;
        lastSwapIndex = 0;
        for (int j = 0; j < k; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                lastSwapIndex = j;
            }
        }
    }
}

示例说明

以下是针对两个不同数据集合的测试用例:

示例一

对于输入数组{10, 7, 3, 1, 9, 7, 4},经过冒泡排序算法之后,得到的结果为{1, 3, 4, 7, 7, 9, 10}。过程如下:

第1轮:
7 10 3 1 9 7 4
7 3 10 1 9 7 4
7 3 1 10 9 7 4
7 3 1 9 10 7 4
7 3 1 9 7 10 4
7 3 1 9 7 4 10
第2轮:
3 7 1 9 7 4 10
3 1 7 9 7 4 10
3 1 7 7 9 4 10
3 1 7 7 4 9 10
第3轮:
1 3 7 4 7 9 10
1 3 4 7 7 9 10
第4轮:
1 3 4 7 7 9 10
第5轮:
1 3 4 7 7 9 10
第6轮:
1 3 4 7 7 9 10

示例二

对于输入数组{1, 2, 3, 4, 5, 6},经过冒泡排序算法之后,得到的结果为{1, 2, 3, 4, 5, 6}。由于该数组已经有序,优化后的冒泡排序算法只执行了一轮循环,效率大大提高。

总结

冒泡排序虽然算法简单易懂,但是效率较低,应该尽量避免在实际的应用场景中使用,针对其时间复杂度比较高的问题,我们可以进行相应的优化,例如减少比较次数和循环次数等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java排序之冒泡排序的实现与优化 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Go语言展现快速排序算法全过程的思路及代码示例

    这里是关于“Go语言展现快速排序算法全过程的思路及代码示例”的详细攻略。 什么是快速排序算法 快速排序算法是一种基于比较的排序算法,它通过选择一个基准元素,将数组分为两部分然后递归地对这两部分进行排序,最终完成对整个数组的排序。快速排序算法的时间复杂度为 O(nlogn) 平均情况下,但是在最坏情况下会退化为 O(n^2)。 快速排序算法的实现思路 下面是快…

    算法与数据结构 2023年5月19日
    00
  • JavaScript插入排序算法原理与实现方法示例

    JavaScript插入排序算法原理与实现方法示例 算法原理 插入排序是一种简单直观的排序算法,其基本原理是将一个待排序的数组依次插入一个有序的数组中,使得最终生成的有序数组是全局有序的。每次将一个待排序的元素插入到有序数组中时,我们从有序数组的末尾开始比较,如果待排序的元素比当前比较的元素小,则交换位置,继续比较,否则插入到当前位置。 实现方法 下面是Ja…

    算法与数据结构 2023年5月19日
    00
  • Java语言字典序排序算法解析及代码示例

    Java语言字典序排序算法解析及代码示例 概述 字典序排序是一种常见的字符串排序算法,其可用于字符串编程中的许多场景,例如:搜索引擎中输入提示的联想;电商网站的商品搜索结果排列;信息化项目中的数据对比等。 本文将介绍Java语言中使用字典序排序的方法以及实现代码,并包含两个代码示例以帮助读者更好地理解。 基本思想 字典序排序的基本思想是将需要排序的字符串按照…

    算法与数据结构 2023年5月19日
    00
  • JS中多层次排序算法的实现代码

    让我为你介绍一份JS中多层次排序算法的实现代码攻略。 简介 多层次排序是指一个列表需要依据不同的规则进行排序,例如按照价格、销量、评分等进行排序。在JS中,我们可以通过自定义排序函数实现多层次排序。 实现 以下是实现多层次排序的示例代码: const products = [ { name: ‘iPhone 11’, price: 799, sales: 1…

    算法与数据结构 2023年5月19日
    00
  • Java实现快速排序和堆排序的示例代码

    Java实现快速排序和堆排序是经常被面试官提问的面试题目之一。下面是一份攻略,来帮助大家快速掌握这两种排序算法。 快速排序 快速排序(Quick Sort)是一种基于分治思想实现的排序算法,其主要思路是通过分区(Partition)操作将一个数组分成两个子数组,再分别对子数组进行排序,从而达到整个数组有序的目的。 以下是Java实现快速排序的示例代码: pu…

    算法与数据结构 2023年5月19日
    00
  • C语言的冒泡排序和快速排序算法使用实例

    C语言的冒泡排序和快速排序算法使用实例 什么是排序算法 排序算法是一种将一组数据按照特定顺序排列的算法。常见的排序算法包括冒泡排序、快速排序、插入排序、选择排序等。 冒泡排序 冒泡排序是一种简单的排序算法,它重复地走访过要排序的元素,依次比较相邻两个元素,如果它们的顺序错误就交换它们的位置。重复这个过程,直到没有再需要交换的元素,即排序完成。 以下是 C 语…

    算法与数据结构 2023年5月19日
    00
  • C语言 实现归并排序算法

    C语言实现归并排序算法的攻略如下: 展示归并排序算法思路 先将待排序的序列拆分成若干小规模子序列,直到每个子序列可以直接排序为止。 然后对每个子序列进行排序,合并成新的有序序列。 重复第二步,直到只剩下一个排序完毕的序列。 C语言代码实现 下面是一份C语言实现归并排序算法的代码,代码内部有详细的注释,可以帮助理解代码: #include <stdio.…

    算法与数据结构 2023年5月19日
    00
  • c#实现选择排序的示例

    C#实现选择排序主要包含以下步骤: 定义数组 遍历数组,选出最小元素,并记录其索引 交换当前索引和最小值索引的元素 循环执行步骤2和步骤3,直到整个数组排序完成 以下是实现选择排序的C#示例: 示例1: int[] arr = new int[]{5, 3, 9, 1, 7, 4}; for (int i = 0; i <arr.Length; i++…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部