详解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定时任务

    实例讲解Java定时任务的攻略如下: 1. 什么是Java定时任务? Java定时任务是指在预定的时间或间隔时间自动执行任务的一种机制,通常用于需要周期性执行的操作。Java常见的定时任务框架有Timer、ScheduledExecutorService和Quartz等。 2. Java定时任务的实现方式 2.1 Timer Timer是Java自带的定时任…

    Java 2023年6月1日
    00
  • Mybatis中自定义实例化SqlSessionFactoryBean问题

    在Mybatis中,SqlSessionFactory是负责创建SqlSession的工厂类。而SqlSessionFactoryBean是把Mybatis和Spring整合的关键类,其主要作用是将SqlSession实例注入到Spring容器中。 在某些情况下,我们需要自定义实例化SqlSessionFactoryBean,比如需要设置动态的数据源,或者自…

    Java 2023年5月20日
    00
  • Java实战之课程信息管理系统的实现

    Java实战之课程信息管理系统的实现 项目简介 课程信息管理系统是一个简单的管理应用程序,它可以帮助学生和教师管理课程信息,包括课程的添加、查询、修改、删除等操作。该系统采用Java语言进行开发,具有良好的可拓展性和易维护性,可以运行在各种平台上。 开发环境 Java SE Development Kit 8 (JDK 8) Eclipse IDE MySQ…

    Java 2023年5月23日
    00
  • SpringBoot配置项目访问路径URL的根路径方式

    在Spring Boot应用程序中,我们可以使用配置文件或注解的方式来配置项目访问路径URL的根路径。本文将详细介绍如何使用这两种方式来配置项目访问路径URL的根路径,并提供两个示例说明。 1. 使用配置文件配置项目访问路径URL的根路径 在Spring Boot应用程序中,我们可以使用application.properties或application.y…

    Java 2023年5月18日
    00
  • java Spring的启动原理详解

    Java Spring是目前最流行的企业级开发框架之一,它帮助开发人员更加高效地进行项目开发和维护。Spring框架的启动过程比较复杂,本文将介绍Java Spring的启动原理详解及其实现过程。 一、 Spring的启动过程 Spring框架的启动过程大体可以归纳为以下几个步骤: 1. 加载配置文件 Spring框架仅在启动时加载配置文件,这些文件包括XM…

    Java 2023年5月19日
    00
  • Java远程调用Shell脚本并获取输出信息【推荐】

    Java远程调用Shell脚本并获取输出信息【推荐】 本文介绍如何使用Java远程调用Linux服务器上的Shell脚本,并获取执行的输出信息。本文介绍两种方法实现该功能:使用JSch库和使用ProcessBuilder类。以下是具体步骤: 准备工作 在开始之前,你需要了解以下知识点: SSH:Secure Shell,即加密的远程登录协议。 SSH公钥认证…

    Java 2023年5月26日
    00
  • Java选择排序法以及实例详解

    Java选择排序法以及实例详解 选择排序是一种简单的排序算法,其基本思想是:每次从待排序的数组中选择最小值,将其放到数组的起始位置,然后从未排序的数组中选择最小值,将其放到已排序部分的下一个位置。依次类推,直到数组排序完成。 选择排序的Java实现 以下是Java实现选择排序的代码: public class SelectionSort { public s…

    Java 2023年5月19日
    00
  • Java 如何解决跨域问题

    Java 如何解决跨域问题 跨域问题是指在浏览器中,当一个网页的脚本试图访问另一个网页的脚本时,由于浏览器的同源策略,会被拒绝访问。Java Web应用程序可以通过以下几种方式来解决跨域问题。 1. CORS(跨域资源共享) CORS是一种机制,允许Web应用程序从不同的域访问其资源。CORS通过在响应头中添加Access-Control-Allow-Ori…

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