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后台返回和处理JSon数据的方法步骤

    Java后台返回和处理JSON数据的方法步骤可以分为以下几个步骤: 步骤一:导入JSON库 首先需要在Java项目中导入Json库,比较流行的有Gson和Jackson。这里以Gson为例: <!–导入Gson依赖–> <dependency> <groupId>com.google.code.gson</gro…

    Java 2023年5月26日
    00
  • 详解 Java中日期数据类型的处理之格式转换的实例

    下面是详解Java中日期数据类型的处理之格式转换的实例的完整攻略。 前言 在Java中,常用的日期数据类型有java.util.Date和java.time.LocalDateTime等。在处理日期时,我们有时需要把日期按照一定的格式进行转换,例如将2022-01-01转换成2022年01月01日。本文将对Java中日期格式转换进行详细讲解,并提供具体的代码…

    Java 2023年5月20日
    00
  • 用Eclipse连接MySQL数据库的步骤

    下面来详细讲解用 Eclipse 连接 MySQL 数据库的步骤。整个过程可以分为以下几个步骤: 准备工作 在进行数据库连接之前,需要进行一些准备工作: 下载和安装 MySQL 数据库。在安装过程中,请记住设置好 root 用户的密码,因为连接数据库需要使用 root 用户名和密码。 下载和安装 JavaSE 开发环境,并安装 Eclipse IDE。 下载…

    Java 2023年6月16日
    00
  • Spring Data JPA映射自定义实体类操作

    下面我将详细讲解“Spring Data JPA映射自定义实体类操作”的完整攻略。 前言 Spring Data JPA 是 Spring 框架中对于数据访问操作的一种规范组件,为使用 JPA 提供了更加便利的方式,而 Spring Data JPA本身也引入了很多适合常用场景下的默认特性和方法,非常适合开发人员进行快速开发和构建。 不过,在开发中有时候我们…

    Java 2023年5月20日
    00
  • Java8新特性:Lambda表达式之方法引用详解

    Java8新特性:Lambda表达式之方法引用详解 Java 8中引入了Lambda表达式,使得Java中的函数式编程变得更加简单。方法引用是Lambda表达式的一种特殊形式,让我们能够重复利用已有方法的实现。 方法引用的概念 方法引用是一个简写形式,它提供了一种方式,让我们可以使用已有方法的规则来编写Lambda表达式。简单来说,方法引用允许你直接引用现有…

    Java 2023年5月26日
    00
  • Springboot整合策略模式详解

    Spring Boot整合策略模式详解 策略模式是一种常用的设计模式,它可以帮助我们在运行时选择不同的算法或行为。在本文中,我们将详细讲解如何在Spring Boot中使用策略模式,并提供两个示例来演示如何使用策略模式。 策略模式简介 策略模式是一种行为型设计模式,它定义了一系列算法或行为,并将它们封装在独立的类中,使得它们可以相互替换。策略模式可以帮助我们…

    Java 2023年5月15日
    00
  • Java读取Excel文件内容的简单实例

    下面是详细解释。 Java读取Excel文件内容的简单实例 前置知识 在学习本文之前,需要掌握以下的知识: Java基础语法; 以及Java处理文件的基本方法。 环境准备 在开始本文之前,需要确保你的计算机中已经安装如下的工具: JDK; Eclipse或者其他Java开发环境。 实现步骤 步骤 1:新建项目 打开Eclipse,依次选择“File”-&gt…

    Java 2023年5月19日
    00
  • Spring Boot启动过程(五)之Springboot内嵌Tomcat对象的start教程详解

    下面就来详细讲解:“Spring Boot启动过程(五)之Springboot内嵌Tomcat对象的start教程详解”。 概述 在Spring Boot应用程序中,内嵌Tomcat对象的启动是用户在执行”java -jar”命令时,由Spring Boot框架自动完成的过程。本篇文章将在介绍Spring Boot内嵌Tomcat对象的启动过程中,详细分析T…

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