java 中冒泡、二分、快速算法详解

Java 中冒泡、二分、快速算法详解

冒泡排序

冒泡排序是一种简单的排序算法,通过不断交换相邻元素的值,把最大或最小的元素逐步“浮”到数列的顶端或底端。具体流程如下:

  1. 比较相邻的两个元素,如果前一个元素大于后一个元素,则交换这两个元素的位置。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾最后一对。这样一轮排序过后,排在数列末尾的元素就是最大或最小的元素。
  3. 再针对除去已排序的元素外的数列中的所有元素进行同样的操作,直到整个数列有序。

冒泡排序的代码实现如下:

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;
            }
        }
    }
}

示例:

int[] arr = {3, 9, 4, 5, 2, 1, 6};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
// 输出结果为:"[1, 2, 3, 4, 5, 6, 9]"

二分查找

二分查找也叫折半查找,是一种高效的查找算法,适用于有序数列。它查找过程从数列的中间元素开始,如果该元素等于查找值,则查找成功,否则根据中间元素和查找值的大小关系,决定去上半段还是下半段继续查找,直到查找值被找到或数列被查找完仍未找到。具体流程如下:

  1. 找到数列的中间值。
  2. 如果中间值等于查找值,则查找成功,返回索引值。
  3. 如果中间值大于查找值,则在中间值的左半部分继续查找。
  4. 如果中间值小于查找值,则在中间值的右半部分继续查找。
  5. 如果未找到,则返回-1。

二分查找的代码实现如下:

public static int binarySearch(int[] arr, int target) {
    int left = 0;
    int right = arr.length - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] > target) {
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return -1;
}

示例:

int[] arr = {1, 2, 3, 4, 5, 6, 9};
int target = 5;
System.out.println(binarySearch(arr, target));
// 输出结果为:"4"

快速排序

快速排序是一种比较常用的排序算法,通过递归将数列不断分解为更小的子数列,然后再将它们合并成一个有序的数列。具体流程如下:

  1. 选择一个基准元素(一般选择数列的第一个元素),把数列分成两部分。
  2. 将比基准元素小的元素放在左边的子序列中,大于基准元素的元素放在右边的子序列中,越过基准元素。
  3. 对左右两个子序列分别进行快速排序,直到各个子序列中只有一个元素或空序列。
  4. 合并所有子序列,得到最终有序序列。

快速排序的代码实现如下:

public static void quickSort(int[] arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int i = left, j = right, pivot = arr[left];
    while (i < j) {
        while (i < j && arr[j] >= pivot) {
            j--;
        }
        if (i < j) {
            arr[i++] = arr[j];
        }
        while (i < j && arr[i] <= pivot) {
            i++;
        }
        if (i < j) {
            arr[j--] = arr[i];
        }
    }
    arr[i] = pivot;
    quickSort(arr, left, i - 1);
    quickSort(arr, i + 1, right);
}

示例:

int[] arr = {3, 9, 4, 5, 2, 1, 6};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
// 输出结果为:"[1, 2, 3, 4, 5, 6, 9]"

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 中冒泡、二分、快速算法详解 - Python技术站

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

相关文章

  • Java中BigDecimal的加减乘除、比较大小与使用注意事项

    Java中BigDecimal的加减乘除、比较大小与使用注意事项 简介 在Java中,double和float等浮点数类型存在精度问题,会出现计算结果不准确的情况。而BigDecimal是一种高精度的数据类型,它可以解决浮点数计算精度问题。BigDecimal的精度可以达到需要表示的精确度,且不会出现计算误差。因此,在需要高精度计算的场合下,我们通常会使用B…

    Java 2023年5月26日
    00
  • STRUTS+AJAX+JSP 请求到后台乱码问题解决方法

    针对 “STRUTS+AJAX+JSP 请求到后台乱码问题解决方法” 这个问题,我们需要分几个步骤来进行讲解。 步骤一:字符集设置 在 web.xml 文件中配置字符集编码为 UTF-8,以支持中文等特殊字符的传输。 <web-app> <filter> <filter-name>encodingFilter</fi…

    Java 2023年6月15日
    00
  • Spring Boot 参数校验的具体实现方式

    下面是 Spring Boot 参数校验的具体实现方式的完整攻略: 第一步:引入依赖 在 pom.xml 中引入依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validat…

    Java 2023年5月20日
    00
  • jsp中如何实现按下回车键自动提交表单

    在JSP中实现按下回车键自动提交表单,可以采用两种方式来实现: 利用JavaScript 利用form表单属性 下面我将给出详细的步骤以及示例说明。 利用JavaScript 在jsp页面中嵌入JavaScript代码段 <script type="text/javascript"> window.onload=functio…

    Java 2023年6月15日
    00
  • java json与map互相转换的示例

    讲解“Java JSON与Map互相转换”的攻略如下: 1. 准备工作 在进行Java JSON与Map互相转换之前,我们需要引入相关依赖。 JSON处理工具包:推荐使用Jackson 或 Gson。 在项目中添加 JSON 处理工具包的依赖。 假设我们使用的是Jackson工具包,我们需要在pom.xml中添加以下依赖信息: <dependency&…

    Java 2023年5月26日
    00
  • Java如何获取主机的基本信息详解

    Java如何获取主机的基本信息详解 在Java中,可以使用InetAddress类获取主机的基本信息,包括主机名、IP地址、地址类型等。本文将详细介绍如何使用InetAddress类获取主机的基本信息,并提供两个示例说明。 InetAddress类的作用 InetAddress类表示一个Internet Protocol(IP)地址。它有两个子类,分别是In…

    Java 2023年5月26日
    00
  • 浅谈java中六大时间类的使用和区别

    浅谈Java中六大时间类的使用和区别 Java中提供了六种对时间进行处理的类:Date、Calendar、SimpleDateFormat、DateFormat、Duration和Instant。这些类都各自有着不同的用法和适用场景。在本文中,我们将详细讨论这些类的区别和用法。 Date类 Date类是Java中处理日期和时间的最基本的类,它提供了一系列方法…

    Java 2023年6月1日
    00
  • 浅谈抛出异常和捕获异常的一些区别

    当我们编写程序时,经常需要处理一些错误或异常。其中,抛出异常和捕获异常是最常见的两种处理方式。 抛出异常 抛出异常是指在程序执行过程中,遇到错误或异常情况,程序会主动抛出一个异常对象,告诉上层调用者当前的问题。抛出异常可以使用throw关键字,抛出的异常对象必须是Java中的Throwable及其子类。例如: public void divide(int x…

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