Java中常用的6种排序算法详细分解

Java中常用的6种排序算法详细分解

在Java中,常用的排序算法主要有六种:冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序。下面将详细讲解这六种算法的原理和实现过程。

冒泡排序

冒泡排序是一种简单的排序算法,它的原理是通过重复地遍历要排序的列表,每遍历一次就把相邻的两个元素比较大小并交换位置。具体实现过程如下:

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

以上代码实现了冒泡排序,时间复杂度为O($n^2$)。

选择排序

选择排序是一种简单的排序算法,它的原理是将列表中的数据分为两个部分,一部分是已排序的,一部分是未排序的。每次遍历未排序的部分,选择其中最小的元素,将其放到已排序的部分的末尾。具体实现如下:

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

以上代码实现了选择排序,时间复杂度为O($n^2$)。

插入排序

插入排序是一种简单的排序算法,它的原理是将一个元素插入到已排序的列表中,并保持已排序的列表依然有序。具体实现如下:

public static void insertionSort(int[] arr) {
    int preIndex, current;
    for (int i = 1; i < arr.length; i++) {
        preIndex = i - 1;
        current = arr[i];
        while (preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex + 1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex + 1] = current;
    }
}

以上代码实现了插入排序,时间复杂度为O($n^2$)。

希尔排序

希尔排序是一种高效的排序算法,它是插入排序的改进版本,它将列表分成若干个子序列,对每个子序列进行插入排序,最终整个列表变得有序。具体实现如下:

public static void shellSort(int[] arr) {
    int len = arr.length;
    int temp, gap = len / 2;
    while (gap > 0) {
        for (int i = gap; i < len; i++) {
            temp = arr[i];
            int preIndex = i - gap;
            while (preIndex >= 0 && arr[preIndex] > temp) {
                arr[preIndex + gap] = arr[preIndex];
                preIndex -= gap;
            }
            arr[preIndex + gap] = temp;
        }
        gap /= 2;
    }
}

以上代码实现了希尔排序,时间复杂度为O($n$ $\log$ $n$)。

归并排序

归并排序是一种常用的排序算法,它的原理是将列表分成若干个子序列,对每个子序列进行排序,最后整合每个子序列,得到一个有序的列表。具体实现如下:

public static void mergeSort(int[] arr, int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

private static void merge(int[] arr, int left, int mid, int right) {
    int i = left, j = mid + 1, k = 0;
    int[] temp = new int[right - left + 1];
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = arr[i++];
    }
    while (j <= right) {
        temp[k++] = arr[j++];
    }
    System.arraycopy(temp, 0, arr, left, temp.length);
}

以上代码实现了归并排序,时间复杂度为O($n$ $\log$ $n$)。

快速排序

快速排序是一种高效的排序算法,它的原理是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,再分别对这两部分数据进行排序。具体实现如下:

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

以上代码实现了快速排序,时间复杂度为O($n$ $\log$ $n$)。

示例说明

以归并排序为例,对一个长度为10的整型数组[5, 2, 6, 0, 3, 9, 1, 7, 4, 8]进行排序,具体操作如下:

  1. 将数组分为两个子序列[5, 2, 6, 0, 3]和[9, 1, 7, 4, 8]。
  2. 对子序列[5, 2, 6, 0, 3]进行归并排序,将它排序成[0, 2, 3, 5, 6]。
  3. 对子序列[9, 1, 7, 4, 8]进行归并排序,将它排序成[1, 4, 7, 8, 9]。
  4. 将两个已排序的子序列[0, 2, 3, 5, 6]和[1, 4, 7, 8, 9]进行合并,得到一个有序的列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。

此时,我们已经完成了对给定数组的排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中常用的6种排序算法详细分解 - Python技术站

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

相关文章

  • Java如果通过jdbc操作连接oracle数据库

    以下是Java通过JDBC连接Oracle数据库的完整攻略,包括代码示例和详细步骤: 一、准备工作 1. 下载Oracle JDBC驱动 首先,我们需要下载Oracle官方的JDBC驱动。我们可以在Oracle官网上下载,或者通过与Oracle数据库的连接成功时给出的链接下载安装。在这里我们以”ojdbc8.jar”为例。 2. 配置Java环境变量 将”o…

    Java 2023年5月19日
    00
  • 微信公众平台获取access_token的方法步骤

    下面是关于微信公众平台获取access_token的方法步骤以及示例说明的完整攻略。 什么是access_token? 在微信公众平台开发中,为了保证安全性,许多接口需要access_token,access_token是认证微信公众账号的全局唯一票据,用于调用微信公众平台开发接口。 获取access_token的方法步骤 准备请求参数 请求参数是指appi…

    Java 2023年5月23日
    00
  • Java后台基于POST获取JSON格式数据

    Java后台基于POST获取JSON格式数据的完整攻略分为以下几个步骤: 1. 发送POST请求 在Java后台中,发送POST请求通常使用HttpURLConnection类,其代码示例如下: URL url = new URL("http://example.com/api"); HttpURLConnection con = (Ht…

    Java 2023年5月26日
    00
  • SpringBoot响应处理实现流程详解

    下面我将详细讲解“SpringBoot响应处理实现流程详解”的完整攻略。 前言 Spring Boot 响应处理的实现流程是相对复杂的,但是熟练掌握后对于实现自己的响应处理或者了解框架背后的原理非常有帮助。 Spring Boot响应处理实现流程详解 Spring Boot 的请求响应处理流程大概如下: 用户请求到达 DispatcherServlet 后,…

    Java 2023年5月15日
    00
  • IDEA安装lombok插件设置Enable Annotation Processing后编译依然报错解决方法

    下面是详细的攻略: 简介 在使用 IDEA 编写 Java 代码时,我们可能会用到 Lombok 工具,这个工具可以帮助我们简化代码,提高开发效率。但是有时我们在使用 Lombok 插件并开启了 Annotation Processing 后,编译依然会报错,这是由于编译器不能正确解析 Lombok 注解所导致的。那么这种情况下应该怎样解决呢?下面我们就来详…

    Java 2023年5月26日
    00
  • Java 数据结构之堆的概念与应用

    Java 数据结构之堆的概念与应用 堆的概念 在计算机科学中,堆(Heap)是一种特殊的数据结构,是一棵树,每个父节点的键值都小于其子节点的键值,这样的堆成为小根堆(Min Heap),反之成为大根堆(Max Heap)。在堆中没有父子关系的节点之间也没有其他约束关系。常见的堆有二叉堆、斐波那契堆等。 对于小顶堆,任意节点的键值都小于或等于其子节点的键值,根…

    Java 2023年5月26日
    00
  • JVM jstack实战之死锁问题详解

    JVM jstack实战之死锁问题详解 什么是死锁 死锁指的是两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法继续执行下去。 如何检测死锁 在 Java 中,可以使用 jstack 命令检测死锁。使用指令 jstack <pid> 可以查看指定进程的堆栈信息, 进而分析出是否存在死锁。 如何解决死锁问题…

    Java 2023年5月27日
    00
  • 将Java程序的输出结果写入文件方法实例

    当我们需要将Java程序输出的结果写入文件时,可以通过Java IO流的方式来实现。下面,我将为大家讲解Java程序中如何将输出结果写入文件的方法。 准备工作 在开始写代码之前,需要进行如下准备工作: 创建File对象,用于操作文件。 创建FileWriter对象,用于写入数据到文件。 创建BufferedWriter对象,用于提高数据写入效率。 实现方法 …

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