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

总结

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

相关推荐
hi0_63 分钟前
03 数组 VS 链表
java·数据结构·c++·笔记·算法·链表
朝如青丝暮成雪_6 分钟前
java的三大特征
java
用户0595661192097 分钟前
Java 8 + 特性与 spring Boot 及 hibernate 等最新技术实操内容全解析
java·架构·设计
ChoSeitaku14 分钟前
NO.3数据结构栈和队列|顺序栈|共享栈|链栈|顺序队|循环队列|链队|双端队列|括号匹配|中缀表达式转后缀|后缀表达式求值
数据结构·microsoft
长安有故里y23 分钟前
tomcat设置预防host头攻击
java·tomcat·firefox
生产队队长24 分钟前
Tomcat问题:启动脚本startup.bat中文乱码问题解决
java·ajax·tomcat
张紫娃36 分钟前
idea 常用快捷键
java·ide·intellij-idea
兮动人40 分钟前
Java应用全链路故障排查实战指南:从系统资源到JVM深度诊断
java·开发语言·jvm
风流 少年1 小时前
Cursor创建Spring Boot项目
java·spring boot·后端
wáng bēn1 小时前
【java17】使用 Word 模板导出带替换符、动态表格和二维码的文档
java·word·itextpdf