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

yizhihongxing

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日

相关文章

  • nginx Rewrite重写地址的实现

    下面是关于“nginx Rewrite重写地址的实现”的完整攻略。 什么是Rewrite? Rewrite是nginx重写地址的功能,它能够改变请求的URL以及请求参数,达到更好的用户体验和SEO优化效果。 Rewrite的配置语法 在nginx配置文件中,Rewrite的配置语法如下所示: rewrite regex replacement [flag];…

    Java 2023年6月15日
    00
  • java实现变更文件查询的方法

    Java 实现变更文件查询的方法,可以通过以下步骤进行: 步骤一:读取文件列表 首先需要读取指定目录下的文件列表。可以使用 Java 的 File 类来实现。代码示例如下: String directory = "/path/to/directory"; File folder = new File(directory); File[] …

    Java 2023年5月19日
    00
  • MyBatis批量查询、插入、更新、删除的实现示例

    接下来我将为您详细讲解如何实现MyBatis批量查询、插入、更新、删除的操作。 1. 批量查询 在MyBatis中,批量查询通常使用select list方式实现,下面是一个简单的示例: <select id="getUserListByIds" resultType="User"> SELECT * FR…

    Java 2023年5月19日
    00
  • MyBatis映射器mapper快速入门教程

    MyBatis是一款基于Java语言的ORM框架,能够帮助开发者轻松完成SQL语句的映射配置,提高开发效率。在使用MyBatis框架时,最常用的就是映射器mapper,本篇文章就来详细讲解一下MyBatis映射器mapper的快速入门教程,包括如何创建映射器mapper、配置映射关系及映射器的使用。 创建MyBatis映射器mapper 创建MyBatis映…

    Java 2023年5月20日
    00
  • nginx实现动静分离的示例代码

    要实现动静分离,即将静态资源和动态请求分别交给不同的服务器或处理方式处理,可以通过Nginx来实现。下面是实现动静分离的完整步骤: 安装Nginx 首先需要安装Nginx,可以通过命令行或者下载安装包来完成,具体可以参考Nginx官网的安装文档。 配置Nginx Nginx的配置文件一般在/etc/nginx/nginx.conf中,需要编辑该文件进行配置。…

    Java 2023年6月16日
    00
  • Java 数组详解及示例代码

    Java 数组详解及示例代码 什么是数组 数组(Array)是由相同类型的数据按照一定的顺序排列而成的集合,是Java程序设计中最基本的数据结构之一。 在Java中,数组可以看成是一种容器,可以存放多个同类型的数据。其中每个数据被称为元素(Element),而在数组中,每个元素可以通过一个编号(Index)进行唯一标识。 创建数组 在Java中,创建数组有两…

    Java 2023年5月23日
    00
  • JSP使用Common FileUpload组件实现文件上传及限制上传类型实例代码

    下面我将详细讲解”JSP使用Common FileUpload组件实现文件上传及限制上传类型实例代码”的完整攻略。 一、介绍 Common FileUpload 是Apache组织开发的一组基于HTTP的文件上传工具,可以方便地实现文件上传功能。在JSP编程中,常常需要使用到该组件。本文将详细介绍JSP如何使用Common FileUpload组件实现文件上…

    Java 2023年6月15日
    00
  • 一文搞懂JSON(JavaScript Object Notation)

    让我来为你详细讲解“一文搞懂JSON(JavaScript Object Notation)”的攻略。 概述 JSON是一种轻量级的数据交换格式,由JavaScript语言创建。它基于JavaScript的对象表示法的部分语法,但是与之不同的是,JSON可以由许多编程语言而不仅仅是JavaScript进行解析和生成。JSON格式的值可以是字符串、数值、布尔值…

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