详解Java冒泡排序

详解Java冒泡排序

什么是冒泡排序

冒泡排序(Bubble Sort),是一种简单的排序算法。它重复地走过要排序的元素列表,比较相邻两个元素的大小,如果顺序错误则交换这两个元素。重复地进行比较和交换操作,直到整个列表排序完成。

在这个过程中,会先比较第1个和第2个元素的大小,如果第1个大于第2个,则交换它们的位置;接着比较第2个和第3个元素的大小,如果第2个大于第3个,则交换它们的位置;依此类推,直到比较到最后一对相邻元素。这样,列表中的最大元素就被“冒泡”到了最右边。然后,重复执行以上操作,直到整个列表排序完成。

冒泡排序的实现方法

下面是Java语言实现冒泡排序的代码:

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

冒泡排序的时间复杂度是O(n²),是一种比较低效的排序算法。但是,在数据规模较小的情况下,冒泡排序是一种简单、容易理解和实现的排序算法。

下面是一个示例,演示了冒泡排序的过程:

假设有这样一个待排序的数组:[3, 1, 4, 2, 5]。

首先,比较3和1的大小,因为3大于1,所以交换它们的位置,数组变成了[1, 3, 4, 2, 5]。

接着,比较3和4的大小,因为3小于4,所以它们的位置不需要交换,数组仍然为[1, 3, 4, 2, 5]。

然后,比较4和2的大小,因为4大于2,所以交换它们的位置,数组变成了[1, 3, 2, 4, 5]。

接着,比较4和5的大小,因为4小于5,所以它们的位置不需要交换,数组仍然为[1, 3, 2, 4, 5]。

此时,第一轮比较结束,可以看到,数组中最大的元素5已经被排到了最右边。

接着进行第二轮比较,比较的范围缩小了一位,也就是说,不再比较最右边的元素。因此,比较的范围是[1, 3, 2, 4]。

在第二轮比较中,找到了数组中第二大的元素4,将它排到了倒数第二个位置。

然后进行第三轮比较,找到了数组中第三大的元素3,将它排到了倒数第三个位置。

接着进行第四轮比较,找到了数组中第四大的元素2,将它排到了倒数第四个位置。

最后,整个数组已经排序完成,结果为[1, 2, 3, 4, 5]。

优化冒泡排序

冒泡排序存在一些缺陷,比如效率低、稳定性差等。因此,在实际应用中,一般不使用纯粹的冒泡排序算法。针对冒泡排序的一些缺陷,可以进行一些优化。

优化1:增加一个标志位

在每次比较过程中,如果没有元素的位置发生改变,说明整个数组已经排序完成,可以直接退出循环,避免多余的比较操作。

下面是Java语言实现冒泡排序,并增加一个标志位的优化代码:

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

优化2:双向冒泡排序

双向冒泡排序(Cocktail Sort),也叫定向冒泡排序,是冒泡排序的一种变种。它是从两个方向交替进行冒泡排序的,比较两个相邻的元素的大小,如果顺序错误则交换它们的位置。一次排序中,先从左往右比较,将最大元素放到最右边,然后从右往左比较,将最小元素放到最左边。

下面是Java语言实现双向冒泡排序的代码:

public static void cocktailSort(int[] arr) {
  int len = arr.length;
  int left = 0;
  int right = len - 1;
  while (left < right) {
    for (int i = left; i < right; i++) {
      if (arr[i] > arr[i + 1]) {
        int temp = arr[i];
        arr[i] = arr[i + 1];
        arr[i + 1] = temp;
      }
    }
    right--;
    for (int i = right; i > left; i--) {
      if (arr[i] < arr[i - 1]) {
        int temp = arr[i];
        arr[i] = arr[i - 1];
        arr[i - 1] = temp;
      }
    }
    left++;
  }
}

总结

冒泡排序是一种简单、容易理解和实现的排序算法,但是它的效率比较低,不适用于数据规模较大的情况。在实际应用中,可以使用一些优化手段,比如增加标志位和双向冒泡排序,提高排序效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java冒泡排序 - Python技术站

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

相关文章

  • JAVA生成pdf文件的实操指南

    JAVA生成PDF文件的实操指南 简介 PDF是一种非常流行的电子文档格式,很多公司和机构都会使用它作为文档的传播方式。对于JAVA开发者来说,生成PDF文件是一个常见的需求。在本篇指南中,我们将介绍如何使用JAVA生成PDF文件的方法,并提供两个示例帮助你更好地理解。 准备工作 在开始生成PDF文件之前,你需要确保以下的环境和工具已经准备就绪: Java …

    Java 2023年5月19日
    00
  • 基于PHP实现栈数据结构和括号匹配算法示例

    让我分步为您讲解“基于PHP实现栈数据结构和括号匹配算法示例”的详细攻略。 1. 栈数据结构的实现 栈是一种简单的数据结构,它可以在常量时间内进行插入和删除操作,被称为“先进后出”的数据结构,其中最新保存的元素始终处于栈的顶部。 在 PHP 中可以用数组实现一个栈结构,例如以下的代码块: class Stack { protected $stack; pub…

    Java 2023年5月26日
    00
  • 图解Java经典算法归并排序的原理与实现

    图解Java经典算法归并排序的原理与实现 算法原理 归并排序是一种基于分治思想的排序算法,它将一个大的问题分解成若干个子问题,然后将子问题拆分到足够小的规模,最后对每个小问题进行解决,最终合并所有解决得到原始问题的解决方案。归并排序的执行过程可以简单地描述为两个步骤,分别为“分”和“治”。 分 归并排序的第一个步骤是分解,它将原始数组分解成若干个子数组,每个…

    Java 2023年5月19日
    00
  • java队列实现方法(顺序队列,链式队列,循环队列)

    Java中队列数据结构可以通过顺序队列、链式队列和循环队列三种方法来实现。下面我们将针对这三种方法分别进行详细讲解。 顺序队列实现方法 1. 定义数据结构 首先我们需要定义一个存储元素的数组,以及头尾指针front和rear来记录队列中的元素位置。 public class SeqQueue<T> { private T[] data; // 存…

    Java 2023年5月26日
    00
  • Servlet Filter过滤器执行顺序

    当一个请求到达Web服务器时,它必须经过多个阶段才能到达最终的目标。Servlet Filter作为一种Web组件,常常用于在请求进入目标资源之前或之后进行请求预处理或响应处理。因此,了解Servlet Filter过滤器的执行顺序很重要。 Servlet Filter过滤器执行顺序如下: 1.容器首先对incoming request进行过滤匹配,寻找所有…

    Java 2023年6月15日
    00
  • Java如何取掉json数据中值为null的属性字段

    当在处理JSON数据时,我们可能会遇到一些值为null的属性字段,而它们并不是我们所需的数据,因此需要将其取掉。 下面给出Java取掉JSON中值为null的属性字段的完整攻略: 使用Jackson库进行JSON处理 Jackson库是一种常用的Java库,它提供了许多处理JSON数据的方法。我们可以使用Jackson库读取JSON字符串并将其转换为Java…

    Java 2023年5月26日
    00
  • Spring连接Mysql数据库全过程

    下面将详细讲解Spring连接MySQL数据库的全过程,包含以下步骤: 1. 引入MySQL JDBC驱动 首先,我们需要在项目中引入MySQL JDBC驱动,由于MySQL JDBC驱动是Maven Central库中最受欢迎的库之一,因此我们可以通过在项目的pom.xml文件中加入以下代码来引入MySQL JDBC驱动: <dependency&g…

    Java 2023年5月20日
    00
  • Springboot集成kafka高级应用实战分享

    为了让大家更好地理解 Springboot 集成 kafka 的应用,我将分别从以下几个部分展开: 环境准备 Springboot 集成 kafka 配置 生产者示例 消费者示例 1. 环境准备 首先需要确保已经正确安装了 Kafka,JDK和 Maven。然后在 pom.xml 文件中引入 Kafka client 相关依赖: <dependenci…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部