Java各种排序算法汇总(冒泡,选择,归并,希尔及堆排序等)

Java各种排序算法汇总

本文将详细讲解Java中常见的各种排序算法,包括冒泡排序、选择排序、归并排序、希尔排序、堆排序等,以及他们的实现代码和时间复杂度分析。

冒泡排序

冒泡排序是一种基础的排序算法,核心思想是将相邻的元素两两比较,将较大的元素向后移动。代码如下:

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

时间复杂度为O(n^2),不适用于大量数据的排序。

选择排序

选择排序的核心思想是每次选择一个最小/最大的元素,在未排序的元素中寻找最小/最大的元素,将其放置于序列起始位置。代码如下:

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

时间复杂度为O(n^2),比较次数与冒泡排序相同,但是交换次数会减少。

归并排序

归并排序是一种基于分治思想的排序算法,核心思想是将待排序的序列分成若干个子序列,每个子序列都是有序的,然后合并子序列成一个整体有序的序列。代码如下:

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

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

时间复杂度为O(nlogn),稳定性好,但是需要使用额外的空间。

希尔排序

希尔排序是一种基于插入排序的排序算法,核心思想是将待排序的序列分成若干个增量序列,对每个增量序列进行插入排序,最后当增量为1时,整个序列排成一个有序序列。代码如下:

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

时间复杂度比较复杂,平均情况下为O(nlogn)。

堆排序

堆排序是一种基于完全二叉树结构的排序算法,核心思想是将待排序的元素构建成一个堆,然后依次取出堆顶元素,加入有序序列中。代码如下:

public static void heapSort(int[] array) {
    int len = array.length - 1;
    for (int i = len / 2; i >= 0; i--) {
        heapAdjust(array, i, len);
    }
    for (int i = len; i > 0; i--) {
        int temp = array[0];
        array[0] = array[i];
        array[i] = temp;
        heapAdjust(array, 0, i - 1);
    }
}

public static void heapAdjust(int[] array, int parent, int len) {
    int temp = array[parent];
    int child = 2 * parent + 1;
    while (child <= len) {
        if (child + 1 <= len && array[child] < array[child + 1]) {
            child++;
        }
        if (temp >= array[child]) {
            break;
        } else {
            array[parent] = array[child];
            parent = child;
            child = 2 * parent + 1;
        }
    }
    array[parent] = temp;
}

时间复杂度为O(nlogn),不稳定。

示例说明

例如,我们有一个待排序的数组:

int[] array = new int[]{4, 9, 8, 3, 5, 1, 6, 2, 7};

如果我们希望对这个数组进行归并排序,我们可以使用以下代码:

MergeSort.mergeSort(array, 0, array.length - 1);

最终得到的有序数组如下:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

再例如,如果我们希望对一个包含大量元素的数组进行排序,我们可以选择堆排序算法,通过以下代码实现:

int[] array = new int[100000];
for (int i = 0; i < 100000; i++) {
    array[i] = (int) (Math.random() * 100000);
}
HeapSort.heapSort(array);

以上代码将产生包含100000个随机元素的数组,然后使用堆排序算法进行排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java各种排序算法汇总(冒泡,选择,归并,希尔及堆排序等) - Python技术站

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

相关文章

  • springmvc fastjson 反序列化时间格式化方法(推荐)

    SpringMVC Fastjson 反序列化时间格式化方法 1. 什么是Fastjson? Fastjson是一个Java语言编写的高性能JSON处理器,它可以将Java对象转换为JSON格式的字符串,也可以将JSON格式的字符串转换为Java对象。Fastjson具有快速、简单、灵活等特点,是目前Java开发中最流行的JSON处理器之一。 2. Spri…

    Java 2023年5月18日
    00
  • SpringMVC项目异常处理机制详解

    在 SpringMVC 项目中,异常处理是非常重要的一部分。如果不正确地处理异常,可能会导致应用程序崩溃或者出现安全漏洞。本文将详细讲解 SpringMVC 项目异常处理机制,包括异常处理器的编写、异常处理流程、异常处理方式等。 编写异常处理器 在 SpringMVC 项目中,我们可以通过编写异常处理器来处理异常。异常处理器是一个类,它实现了 Spring …

    Java 2023年5月18日
    00
  • SpringCloud2020版本配置与环境搭建教程详解

    SpringCloud 2020版本配置与环境搭建教程详解 简介 Spring Cloud 作为微服务框架之一,在微服务架构中扮演着重要角色。本文将介绍Spring Cloud 2020版本的环境搭建教程,帮助你搭建基于Spring Cloud微服务架构的项目。 步骤 1. 准备环境 首先需要准备以下环境: JDK 1.8+ Maven IDE(推荐使用In…

    Java 2023年5月20日
    00
  • Java之Mybatis多层嵌套查询方式

    下面我会为大家详细讲解“Java之Mybatis多层嵌套查询方式”的完整攻略。 1. 什么是多层嵌套查询? 多层嵌套查询指的是在进行数据库查询时,需要查询多个关联表才能获取最终的结果。这种情况下,我们需要在 SQL 语句中使用多个子查询,把不同层级的查询进行组合,才能得到最终的结果。 2. Mybatis 多层嵌套查询的实现方式 Mybatis 多层嵌套查询…

    Java 2023年5月20日
    00
  • Java8实现FTP及SFTP文件上传下载

    下面是关于“Java8实现FTP及SFTP文件上传下载”的完整攻略。 一、FTP文件上传下载 1.1 准备工作 在开始前,需要引入以下的Maven依赖: <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifac…

    Java 2023年5月19日
    00
  • Struts2实现多文件上传功能

    第一步:引入依赖在项目的 pom.xml 文件中添加以下依赖: <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1&lt…

    Java 2023年5月20日
    00
  • SpringMVC超详细讲解视图和视图解析器

    以下是关于“SpringMVC超详细讲解视图和视图解析器”的完整攻略,其中包含两个示例。 1. 前言 SpringMVC是一种常用的Java Web开发框架,它可以帮助开发者快速构建Web应用程序。本攻略将详细讲解SpringMVC的视图和视图解析器,帮助读者更好地掌握SpringMVC框架的使用方法。 2. 视图 在SpringMVC中,视图是用于渲染响应…

    Java 2023年5月16日
    00
  • java如何判断一个数是否是素数(质数)

    判断一个数是否是素数是一个常见的算法问题,下面是用java编写的实现方法: 1.判断算法 判断一个数x是否为素数的方法是判断x是否能被2~sqrt(x)范围内的整数整除。如果有一个数能够整除x,那么x就不是素数,否则x就是素数。 示例代码: public static boolean isPrime(int x) { if (x < 2) { // 小…

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