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);  
}

总结

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

相关推荐
互联网全栈架构18 分钟前
遨游Spring AI:第一盘菜Hello World
java·人工智能·后端·spring
优秀的颜1 小时前
计算机基础知识(第五篇)
java·开发语言·分布式
BillKu1 小时前
Java严格模式withResolverStyle解析日期错误及解决方案
java
网安INF1 小时前
ElGamal加密算法:离散对数难题的安全基石
java·网络安全·密码学
AWS官方合作商2 小时前
在CSDN发布AWS Proton解决方案:实现云原生应用的标准化部署
java·云原生·aws
gadiaola3 小时前
【JVM】Java虚拟机(二)——垃圾回收
java·jvm
眼镜哥(with glasses)3 小时前
蓝桥杯 国赛2024python(b组)题目(1-3)
数据结构·算法·蓝桥杯
coderSong25686 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
Mr_Air_Boy7 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
豆沙沙包?7 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏