Java 数据结构篇-深入了解排序算法

概述

排序算法是计算机科学中的基本问题,也是数据结构学习的重要部分。在Java中,我们可以使用各种排序算法来排列数组或列表中的元素。以下是几个常见的排序算法及其基本思想的介绍:

排序算法介绍

1. 冒泡排序(Bubble Sort)

基本思想:通过相邻元素之间的比较和交换,使得每一趟排序后,最大(或最小)的元素能够"浮"到数列的一端。

Java示例:

java 复制代码
public static void bubbleSort(int[] arr) {  
    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]) {  
                // 交换 arr[j] 和 arr[j + 1]  
                int temp = arr[j];  
                arr[j] = arr[j + 1];  
                arr[j + 1] = temp;  
            }  
        }  
    }  
}

2. 选择排序(Selection Sort)

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

Java示例:

java 复制代码
public static void selectionSort(int[] arr) {  
    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;  
            }  
        }  
        // 交换 arr[i] 和 arr[minIndex]  
        int temp = arr[i];  
        arr[i] = arr[minIndex];  
        arr[minIndex] = temp;  
    }  
}

3. 插入排序(Insertion Sort)

基本思想:将待排序的元素按其大小逐个插入到已经排序的序列中的适当位置,直到全部插入完毕。

Java示例:

java 复制代码
public static void insertionSort(int[] arr) {  
    int n = arr.length;  
    for (int i = 1; i < n; ++i) {  
        int key = arr[i];  
        int j = i - 1;  
        while (j >= 0 && arr[j] > key) {  
            arr[j + 1] = arr[j];  
            j = j - 1;  
        }  
        arr[j + 1] = key;  
    }  
}

4. 归并排序(Merge Sort)

基本思想:采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

Java示例:

java 复制代码
public static void mergeSort(int[] arr) {  
    if (arr.length < 2) {  
        return;  
    }  
    int mid = arr.length / 2;  
    int[] left = Arrays.copyOfRange(arr, 0, mid);  
    int[] right = Arrays.copyOfRange(arr, mid, arr.length);  
    mergeSort(left);  
    mergeSort(right);  
    merge(arr, left, right);  
}  
  
private static void merge(int[] arr, int[] left, int[] right) {  
    int i = 0, j = 0, k = 0;  
    while (i < left.length && j < right.length) {  
        if (left[i] <= right[j]) {  
            arr[k++] = left[i++];  
        } else {  
            arr[k++] = right[j++];  
        }  
    }  
    while (i < left.length) {  
        arr[k++] = left[i++];  
    }  
    while (j < right.length) {  
        arr[k++] = right[j++];  
    }  
}

5. 快速排序(Quick Sort)

基本思想:通过一次排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

Java示例:

java 复制代码
public static void quickSort(int[] arr, int low, int high) {  
    if (low < high) {  
        int pivotIndex = partition(arr, low, high);  
        quickSort(arr, low, pivotIndex - 1);  
        quickSort(arr, pivotIndex + 1, high);  
    }  
}  
  
private static int partition(int[] arr, int low, int high) {  
    int pivot = arr[high]; // 选择最右边的元素作为枢轴  
    int i = low - 1; // 指向最小元素的指针  
    for (int j = low; j < high; j++) {  
        if (arr[j] <= pivot) {  
            i++;  
            // 交换 arr[i] 和 arr[j]  
            int temp = arr[i];  
            arr[i] = arr[j];  
            arr[j] = temp;  
        }  
    }  
    // 将枢轴元素放到正确的位置  
    int temp = arr[i + 1];  
    arr[i + 1] = arr[high];  
    arr[high] = temp;  
    return i + 1;  
}  
  
// 调用快速排序的方法  
public static void quickSort(int[] arr) {  
    quickSort(arr, 0, arr.length - 1);  
}

总结

每种排序算法都有其优点和缺点。例如,冒泡排序和插入排序在小型数组或几乎有序的数组上表现良好,但它们的性能在大型数组上较差。选择排序在小型数组上表现良好,但在大型数组上效率较低。归并排序和快速排序在大型数组上表现良好,但归并排序需要额外的空间来合并子数组,而快速排序在某些情况下可能会遇到最坏情况的时间复杂度。因此,在选择排序算法时,需要根据具体情况和需求进行权衡。

相关推荐
2301_803554521 小时前
C++联合体(Union)详解:与结构体的区别、联系与深度解析
java·c++·算法
EnCi Zheng1 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印6011 小时前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring
为什么我不是源代码1 小时前
JPA读取数据库离谱问题-No property ‘selectClassByName‘ found-Not a managed type
java·sql
Lisonseekpan1 小时前
Guava Cache 高性能本地缓存库详解与使用案例
java·spring boot·后端·缓存·guava
我真的是大笨蛋2 小时前
Redis的String详解
java·数据库·spring boot·redis·spring·缓存
心态特好2 小时前
Jwt非对称加密的应用场景
java
敢敢J的憨憨L2 小时前
GPTL(General Purpose Timing Library)使用教程
java·服务器·前端·c++·轻量级计时工具库
sg_knight3 小时前
Spring Cloud与RabbitMQ深度集成:从入门到生产级实战
java·spring boot·spring·spring cloud·消息队列·rabbitmq·stream
冷徹 .3 小时前
2024ICPC区域赛香港站
数据结构·c++·算法