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 实现代码。

阅读剩余 85%

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

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

相关文章

  • 如何实现人民币的大写转换?

    人民币的大写转换是前端开发中需要涉及到的一个非常常见的需求,下面我将详细讲解如何实现人民币的大写转换。 1. 准备工作 首先需要明确的是,人民币的大写转换规则是非常繁琐复杂的,因此写代码之前我们需要理清楚具体的转换规则。在这里,我提供一个比较通用的代码实现,其中包含了大部分的转换规则,如果有需要可以根据自己的实际需求做调整。代码实现如下: function …

    Java 2023年6月15日
    00
  • 常用的java日期比较和日期计算方法小结

    当涉及处理日期和时间时,Java内置了许多日期类和方法来进行各种操作。在本文中,我们将探讨一些常用的日期比较和日期计算方法,这些方法可以帮助我们在Java中轻松处理各种日期和时间相关的操作。 比较日期 在Java中比较日期的最常用方法是使用compareTo方法。这个方法将返回一个整数,表示两个日期之间的差异。如果第一个日期在第二个日期之前,返回的整数将小于…

    Java 2023年5月20日
    00
  • 详解WebSocket+spring示例demo(已使用sockJs库)

    详解WebSocket+Spring示例Demo(已使用SockJS库) WebSocket是一种在Web浏览器和服务器之间进行全双工通信的协议。Spring框架提供了对WebSocket的支持,使得我们可以轻松地在Spring应用程序中实现WebSocket通信。本文将详细讲解如何使用Spring框架实现WebSocket通信,并提供两个示例说明。 1. …

    Java 2023年5月18日
    00
  • java system类使用方法示例 获取系统信息

    当我们需要获取系统基本信息时,可以使用Java中的System类。它提供了许多有用的静态方法,方便我们获取系统信息。这里就让我们来详细讲解“java system类使用方法示例 获取系统信息”的完整攻略。 1. 获取系统属性信息 使用System.getProperty()方法可以获取系统的属性信息,如下所示: public class Example { …

    Java 2023年6月15日
    00
  • springmvc如何使用POJO作为参数

    在 SpringMVC 中,我们可以使用 POJO(Plain Old Java Object)作为控制器方法的参数。使用 POJO 作为参数可以使代码更加简洁、易于维护。本文将详细讲解 SpringMVC 如何使用 POJO 作为参数,包括 POJO 的定义、POJO 作为参数的控制器方法的编写、POJO 的数据绑定等。 定义 POJO 在 SpringM…

    Java 2023年5月18日
    00
  • SpringSecurity 表单登录的实现

    下面是“SpringSecurity 表单登录的实现”的完整攻略: 什么是SpringSecurity? SpringSecurity 是一种基于 Spring 的安全框架,可以为 web 应用程序提供身份验证(Authentication)、授权(Authorization)和其他安全性功能。SpringSecurity 可以轻松集成到现有的 Spring…

    Java 2023年6月3日
    00
  • JSP中使用JSTL按不同条件输出内容的方法

    下面我将详细讲解JSP中使用JSTL按不同条件输出内容的方法的完整攻略。 1. 什么是 JSTL? JavaServer Pages (JSP) 标准标记库(英文全称为:JavaServer Pages Standard Tag Library,简称为JSTL)是SUN公司内部开发的一套在JSP中使用的JSP标准标签库,它封装了JSP应用的通用核心功能,便于…

    Java 2023年6月15日
    00
  • Java实现序列化与反序列化的简单示例

    下面我将详细讲解“Java实现序列化与反序列化的简单示例”的完整攻略。 什么是序列化和反序列化? Java中的序列化是指将对象转换为字节流,可以将这些字节保存到磁盘上,或通过网络传输到远程系统;而反序列化则是将字节流从磁盘或者网络中读取出来,重新生成该对象的过程。 这两个过程是Java编程中的重要概念,使程序能够跨越网络连接和持久化存储等,也是Java远程方…

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