【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!

简介: 【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。

Java排序算法是编程基础中的重要组成部分,它们不仅在算法设计与分析课程中占有重要地位,而且在实际开发工作中也发挥着不可替代的作用。从简单的冒泡排序到高效的快速排序,每种排序算法都有其独特的应用场景和优缺点。本文将以最佳实践的形式,探讨几种常见的排序算法在Java中的实现,并讨论它们的应用场景。

排序算法概述

排序算法是将一组无序的数据按照一定的顺序排列的过程。排序可以分为内部排序和外部排序两大类,内部排序是指待排序的数据全部存放在内存中,而外部排序则是数据量过大以至于不能完全放入内存,需要借助外部存储器进行排序。本文主要关注内部排序算法。

冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较每对相邻元素,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复进行的,直到没有再需要交换的元素为止,也就是说该列表已经排序完成。

实现示例

public static void bubbleSort(int[] arr) {
   
    int n = arr.length;
    boolean swapped;
    for (int i = 0; i < n - 1; i++) {
   
        swapped = false;
        for (int j = 0; j < n - 1 - i; 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;
                swapped = true;
            }
        }
        // 如果在这一轮中没有发生任何交换,则数组已经排序完成
        if (!swapped) break;
    }
}

快速排序

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

实现示例

public static void quickSort(int[] arr, int low, int high) {
   
    if (low < high) {
   
        // pi 是分区索引,arr[pi] 现在处于正确位置
        int pi = partition(arr, low, high);

        // 递归地排序分区左侧和右侧的元素
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 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;
        }
    }

    // 交换 arr[i+1] 和 arr[high] (或 pivot)
    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;

    return i + 1;
}

归并排序

归并排序是一种稳定的排序算法,它采用分治策略,将数组分成两个子数组,递归地对这两个子数组进行排序,然后将两个已排序的子数组合并成一个最终的排序数组。

实现示例

public static void mergeSort(int[] arr, int l, int r) {
   
    if (l < r) {
   
        // 找到中间点
        int m = (l + r) / 2;

        // 递归地将左半部和右半部分别排序
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);

        // 合并两个已排序的子数组
        merge(arr, l, m, r);
    }
}

private static void merge(int[] arr, int l, int m, int r) {
   
    int n1 = m - l + 1;
    int n2 = r - m;

    // 创建临时数组
    int L[] = new int[n1];
    int R[] = new int[n2];

    // 复制数据到临时数组 L[] 和 R[]
    for (int i = 0; i < n1; ++i)
        L[i] = arr[l + i];
    for (int j = 0; j < n2; ++j)
        R[j] = arr[m + 1 + j];

    // 合并临时数组回到 arr[l..r]
    int i = 0, j = 0;

    // 初始索引 k 的值
    int k = l;
    while (i < n1 && j < n2) {
   
        if (L[i] <= R[j]) {
   
            arr[k] = L[i];
            i++;
        } else {
   
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    // 复制 L[] 的剩余元素
    while (i < n1) {
   
        arr[k] = L[i];
        i++;
        k++;
    }

    // 复制 R[] 的剩余元素
    while (j < n2) {
   
        arr[k] = R[j];
        j++;
        k++;
    }
}

应用场景

排序算法在许多场景中都有广泛的应用。例如,在电子商务网站中,用户可能需要按照价格、销量、评分等不同标准对商品进行排序;在搜索引擎中,搜索结果需要按照相关性进行排序;在数据分析领域,排序算法是数据预处理的关键步骤之一。

总结

通过本文的介绍,我们了解了几种常见的排序算法,并学习了它们在Java中的实现。排序算法是计算机科学的基础,掌握这些算法不仅可以提高编程技能,还可以在实际项目中提高代码的效率和可维护性。无论是选择最合适的排序算法还是实现自己的排序逻辑,理解排序算法背后的原理都是非常重要的。

相关文章
|
4天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
6天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
8天前
|
算法 容器
令牌桶算法原理及实现,图文详解
本文介绍令牌桶算法,一种常用的限流策略,通过恒定速率放入令牌,控制高并发场景下的流量,确保系统稳定运行。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
令牌桶算法原理及实现,图文详解
|
15天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
8天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
20 3
|
14天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
47 3
|
14天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
8天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
10天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。