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_7807896618 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
m0_6399069419 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
学长毕设19 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
步行cgn20 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川20 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵20 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David20 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas10020 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin21 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质1 天前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring