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日

相关文章

  • 教你使用idea搭建ssm详细教程(Spring+Spring Mvc+Mybatis)

    以下是使用Idea搭建SSM框架的详细教程,包括Spring、Spring MVC和MyBatis三个框架的整合。 环境准备 在开始之前,需要确保以下环境已经准备好: JDK 1.8或以上版本 Maven 3.0或以上版本 Tomcat 8.0或以上版本 IntelliJ IDEA 2018或以上版本 创建Maven项目 打开IntelliJ IDEA,选择…

    Java 2023年5月18日
    00
  • boot-admin开源项目中有关后端参数校验的最佳实践

    我们在项目开发中,经常会对一些参数进行校验,比如非空校验、长度校验,以及定制的业务校验规则等,如果使用if/else语句来对请求的每一个参数一一校验,就会出现大量与业务逻辑无关的代码,繁重不堪且繁琐的校验,会大大降低我们的工作效率,而且准确性也无法保证。为保证数据的正确性、完整性,前后端都需要进行数据检验。本文对开源 boot-admin 项目的后端校验实践…

    Java 2023年5月7日
    00
  • Java数组归纳总结

    Java数组归纳总结 在Java语言中,数组是一种非常常用的数据结构,可以用来存储同一类型的数据。本文将对Java数组进行归纳总结,包括数组的定义、初始化、遍历、复制、排序等常用操作,以及一些常见问题和解决方案。 数组的定义 Java数组是一种固定长度的数据结构,可以存储同一类型的数据。数组定义时需要指定数组的长度和类型。 声明一个长度为10,类型为int的…

    Java 2023年5月26日
    00
  • Java中API的使用方法详情

    Java中的API,即应用程序接口,是Java开发者最常使用的工具之一。它被用于与Java中的系统、库、框架和外部资源进行交互。学习如何正确使用API是Java开发的重要一步。下面我们来详细讲解Java中API的使用方法: 1. API的获取 Java API可以通过不同的渠道来获取。Java官方文档网站提供了最完整的API文档,也可以通过IDE编译器的帮助…

    Java 2023年5月26日
    00
  • Java的反射机制—动态调用对象的简单方法

    Java的反射机制—动态调用对象的简单方法 Java反射机制是指程序在运行时可以获取自身的信息,并能够操作类或者对象的属性、方法和构造方法。反射机制可以在运行时动态地获取对象的信息,而不需要事先知道构造函数、方法、属性等信息。在Java中反射机制有很多应用场景,最常见的就是在框架中通过获取类信息动态创建对象实例、调用类的方法等。 具体步骤 使用Java反…

    Java 2023年5月26日
    00
  • Java多线程编程中使用DateFormat类

    在Java多线程编程中,DateFormat类是常用的日期格式化类。本篇攻略将详细讲解如何在多线程环境中正确使用DateFormat类。 为什么要使用DateFormat类 在Java编程中,处理日期时间是一个常见的需求。格式化Date对象为字符串、解析字符串为Date对象等都需要用到日期格式化类。DateFormat类是一种线程不安全的类,因为DateFo…

    Java 2023年5月18日
    00
  • 详解SpringMVC的两种实现方式

    详解SpringMVC的两种实现方式 Spring MVC是一个基于MVC架构的Web框架,它可以用于构建Web应用程序。Spring MVC框架提供了一组组件,包括控制器、视解析器、处理器映射器、数据绑定、数据验证、异常处理等,可以帮助我们快速开发Web应用程序。在Spring MVC中,我们可以使用两种方式来实现控制器:注解方式和XML配置方式。 注解方…

    Java 2023年5月18日
    00
  • JAVA jvm系列–java内存区域

    JAVA jvm系列–java内存区域 介绍 JVM(Java虚拟机)是Java语言的关键技术之一,它能够将跨平台性,垃圾回收以及自我保护机制等多种高级特性实现在Java语言中。Java内存区域是JVM中的一个子系统,用于管理Java程序运行过程中所需的内存空间。本文将对Java内存区域进行详细介绍,帮助读者深入理解Java程序的底层实现原理。 Java内…

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