Java之经典排序算法

Java之经典排序算法

本文将详细讲解 Java 中常见的经典排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序和堆排序等七种算法,并给出示例代码。

冒泡排序

冒泡排序是最简单的排序算法之一,基本思想是将相邻的元素两两比较,如果前一个元素比后一个元素大,就将它们两者交换位置。重复这个过程,直到整个序列有序为止。

下面是 Java 实现代码:

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

选择排序

选择排序的基本思想是每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

下面是 Java 实现代码:

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

插入排序

插入排序的基本思想是将待排序的元素按大小插入到已排序好的部分元素中。

下面是 Java 实现代码:

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

希尔排序

希尔排序是插入排序的一种高效率改进版本。基本思想是将数组分成若干长度为 gap 的子序列,然后对每个子序列进行插入排序,最后合并成一个完整的序列。

下面是 Java 实现代码:

public static void shellSort(int[] arr) {
    if (arr == null || arr.length == 0) {
        return;
    }
    int n = arr.length;
    int gap = n / 2;
    while (gap > 0) {
        for (int i = gap; i < n; i++) {
            int j = i;
            int current = arr[i];
            while (j - gap >= 0 && current < arr[j - gap]) {
                arr[j] = arr[j - gap];
                j -= gap;
            }
            arr[j] = current;
        }
        gap /= 2;
    }
}

归并排序

归并排序是一种分治思想的排序算法,它将原始序列分为若干个子序列,分别进行排序,然后将排好序的子序列合并成一个完整的有序序列。

下面是 Java 实现代码:

public static void mergeSort(int[] arr, int left, int right) {
    if (arr == null || arr.length == 0) {
        return;
    }
    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[] tmp = new int[right - left + 1];
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {
        if (arr[i] < arr[j]) {
            tmp[k++] = arr[i++];
        } else {
            tmp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        tmp[k++] = arr[i++];
    }
    while (j <= right) {
        tmp[k++] = arr[j++];
    }
    for (int p = 0; p < tmp.length; p++) {
        arr[left + p] = tmp[p];
    }
}

快速排序

快速排序是一种分治思想的排序算法,通过一趟排序将要排序的数列分成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,再对这两部分数据分别进行快速排序。

下面是 Java 实现代码:

public static void quickSort(int[] arr, int left, int right) {
    if (arr == null || arr.length == 0) {
        return;
    }
    if (left < right) {
        int pivotIndex = partition(arr, left, right);
        quickSort(arr, left, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, right);
    }
}

private static int partition(int[] arr, int left, int right) {
    int pivot = arr[right];
    int i = left - 1;
    for (int j = left; j < right; j++) {
        if (arr[j] < pivot) {
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    int temp = arr[i + 1];
    arr[i + 1] = arr[right];
    arr[right] = temp;
    return i + 1;
}

堆排序

堆排序是一种树形选择排序算法,它利用了堆这种数据结构的特点进行排序,构造一个堆,将要排序的序列放在堆中,然后进行排序。

下面是 Java 实现代码:

public static void heapSort(int[] arr) {
    if (arr == null || arr.length == 0) {
        return;
    }
    int n = arr.length;
    for (int i = n / 2 - 1; i >= 0; i--) {
        adjustHeap(arr, i, n);
    }
    for (int i = n - 1; i >= 0; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        adjustHeap(arr, 0, i);
    }
}

private static void adjustHeap(int[] arr, int i, int length) {
    int temp = arr[i];
    for (int j = 2 * i + 1; j < length; j = j * 2 + 1) {
        if (j + 1 < length && arr[j] < arr[j + 1]) {
            j++;
        }
        if (arr[j] > temp) {
            arr[i] = arr[j];
            i = j;
        } else {
            break;
        }
    }
    arr[i] = temp;
}

示例说明

以冒泡排序和快速排序为例,给出示例以说明排序过程。

假设要排序的数组为:

{6, 3, 8, 2, 9, 1}

冒泡排序示例

第一次排序:

[3, 6] [8, 2] [9, 1]

第二次排序:

[3, 2, 6] [8, 1, 9]

第三次排序:

[2, 3, 6, 1, 8, 9]

第四次排序:

[2, 3, 1, 6, 8, 9]

第五次排序:

[2, 1, 3, 6, 8, 9]

第六次排序:

[1, 2, 3, 6, 8, 9]

快速排序示例

以中间数 8 为枢轴进行快速排序,排序过程如下:

left=0, right=5, pivotIndex=2

[3, 6, 1, 2, 9, 8]

left=0, right=1, pivotIndex=0

[3, 6, 1, 2, 9, 8]

left=3, right=5, pivotIndex=5

[3, 6, 1, 2, 8, 9]

left=3, right=4, pivotIndex=3

[3, 2, 1, 6, 8, 9]

left=0, right=2, pivotIndex=1

[2, 3, 1, 6, 8, 9]

left=0, right=0, pivotIndex=0

[2, 3, 1, 6, 8, 9]

left=4, right=5, pivotIndex=5

[2, 3, 1, 6, 8, 9]

left=4, right=4, pivotIndex=4

[2, 3, 1, 6, 8, 9]

left=2, right=3, pivotIndex=2

[1, 3, 2, 6, 8, 9]

left=2, right=1, pivotIndex=2

[1, 3, 2, 6, 8, 9]

经过上述操作,排序完成,最终数组为:

{1, 2, 3, 6, 8, 9}

这就是冒泡排序和快速排序两种算法的基本思想、示例和 Java 实现代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java之经典排序算法 - Python技术站

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

相关文章

  • Java SimpleDateFormat中英文时间格式化转换详解

    下面是关于“Java SimpleDateFormat中英文时间格式化转换详解”的完整攻略: 1. 概述 在Java中,我们经常需要把日期或时间格式化成指定格式的字符串,或者将字符串转换为日期或时间。SimpleDateFormat类就是一个非常常用的类,它可以根据给定的日期时间格式模板将一个Date对象格式化为字符串,或将一个字符串解析为Date对象。 S…

    Java 2023年5月20日
    00
  • 详解Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送

    下面是详解Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送的完整攻略: 1. 安装Jenkins和Gitlab的插件 首先,我们需要在Jenkins中安装Gitlab插件和DingTalk插件。 进入Jenkins管理界面,选择“插件管理”,在可选插件中找到Gitlab插件,点击安装即可。同样的,找到DingTalk插件也进行安装…

    Java 2023年5月26日
    00
  • JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析

    JSON在Javascript中的使用是非常常见的操作,JSON是一种轻量级的数据格式,非常适合用于数据交互。在Javascript中,我们可以使用两种方式来解析JSON数据,一种是eval函数,另一种是JSON.parse方法。本篇文章将详细解析这两种方式的异同以及使用姿势。 eval函数 eval函数是Javascript中自带的函数,用于执行一段字符串…

    Java 2023年5月26日
    00
  • Java异常退出条件的判断示例代码

    介绍Java异常退出条件的判断示例代码前,需要了解什么是Java异常。 Java异常是指在程序执行过程中出现的错误或异常情况。如果不捕获和处理异常,程序将会终止运行。Java程序处理异常情况的方式是通过捕捉异常和处理异常。而Java异常退出条件的判断示例代码,则是指在遇到异常的情况下,判断异常的错误类型,根据错误类型进行相应的处理,从而避免程序的崩溃。 攻略…

    Java 2023年5月27日
    00
  • Java对象的创建过程是什么?

    Java对象的创建过程是Java程序中非常基础、也非常重要的一部分。在Java编程中开发者需要清楚理解Java对象创建的整个流程,本文将为读者详细讲解Java对象的创建过程。 Java对象的创建过程 在Java编程中,创建一个Java对象涉及到了三个步骤: 1、类的加载与加载机制 类的加载与加载机制是Java程序启动时的第一步,Java类需要在Java虚拟机…

    Java 2023年5月11日
    00
  • 详解SpringBoot 添加对JSP的支持(附常见坑点)

    详解SpringBoot 添加对JSP的支持(附常见坑点) 在使用Spring Boot开发Web应用程序时,我们可能需要使用JSP来渲染视图。但是,Spring Boot默认不支持JSP,需要进行一些配置才能使用。本文将详细介绍如何添加对JSP的支持,并列举一些常见的坑点。 1. 添加对JSP的支持 要添加对JSP的支持,我们需要在pom.xml文件中添加…

    Java 2023年5月18日
    00
  • 批量上传Jar包到Maven私服的工具的方法

    下面是批量上传Jar包到Maven私服的工具的方法的完整攻略: 前置条件 确保已安装好Maven、Java和Git; 确保已创建好Maven私服; 确保已准备好需要上传的Jar包文件。 步骤一:克隆工具项目 使用Git命令或者在GitHub上下载项目源代码,并解压至本地。 git clone https://github.com/lilicoding/mav…

    Java 2023年5月20日
    00
  • Spring MVC深入学习之启动初始化过程

    Spring MVC深入学习之启动初始化过程 Spring MVC是一个非常流行的开源Java MVC框架,拥有良好的扩展性和自由度,使用Spring MVC可以快速开发Web应用程序。在本文中,将详细讲解Spring MVC的启动初始化过程,帮助您更好地理解Spring MVC。 Servlet容器启动 在Web应用程序启动时,Servlet容器会根据we…

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