博客
关于我
算法——十大排序算法(java版本实现)
阅读量:368 次
发布时间:2019-03-04

本文共 2319 字,大约阅读时间需要 7 分钟。

冒泡排序是一种简单且直观的排序算法,通过反复交换相邻元素,逐步将元素“冒”到正确的位置。传统的冒泡排序在每一轮中从数组的最开始逐步向下移动一位,直到处理完整个数组。然而,这种方法在数据已经较为有序的情况下可能会产生较多的不必要比较和交换,导致效率低下。因此,人们对冒泡排序进行了多次优化,以提高其效率。

传统冒泡排序

传统的冒泡排序代码如下:

public static void sort(int[] array) {    for (int i = 0; i < array.length - 1; i++) {        for (int j = 0; j < array.length - i - 1; j++) {            int temp = 0;            if (array[j] > array[j + 1]) {                temp = array[j];                array[j] = array[j + 1];                array[j + 1] = temp;            }        }    }    if (isSorted) {        break;    }}

优化一:添加有序标记

优化一通过在每一轮排序中添加一个标记,判断是否有元素交换。如果没有交换,说明数组已经有序,可以提前结束排序。

优化一代码如下:

public static void sort(int[] array) {    for (int i = 0; i < array.length - 1; i++) {        boolean isSorted = true;        for (int j = 0; j < array.length - i - 1; j++) {            int temp = 0;            if (array[j] > array[j + 1]) {                temp = array[j];                array[j] = array[j + 1];                array[j + 1] = temp;                isSorted = false;            }        }        if (isSorted) {            break;        }    }}

优化二:记录无序边界

优化二通过记录最后一次交换的位置,确定无序数组的边界,从而减少不必要的比较。

优化二代码如下:

public static void sort(int[] array) {    for (int i = 0; i < array.length - 1; i++) {        boolean isSorted = true;        int sortBorder = array.length - 1;        for (int j = 0; j < sortBorder; j++) {            int temp = 0;            if (array[j] > array[j + 1]) {                temp = array[j];                array[j] = array[j + 1];                array[j + 1] = temp;                isSorted = false;                sortBorder = j;            }        }        if (isSorted) {            break;        }    }}

其他排序算法简介

  • 选择排序

    • 通过线性扫描找出当前最小的元素,交换到正确位置,直到整个数组排序。
    • 时间复杂度:O(n²)
    • 优点:简单易懂
  • 插入排序

    • 将元素逐个插入到已排序的数组中,保持数组有序。
    • 时间复杂度:O(n²)
    • 优点:稳定排序
  • 希尔排序

    • 基于冒泡排序和选择排序,通过分治策略减少比较次数。
    • 时间复杂度:O(n log³ n)
    • 优点:在某些情况下比快速排序更高效
  • 快速排序

    • 通过选择枢轴元素,将数组分为两部分,递归排序。
    • 时间复杂度:O(n log n)
    • 优点:平均时间复杂度接近O(n)
  • 归并排序

    • 将数组分成两半,分别排序后合并。
    • 时间复杂度:O(n log n)
    • 优点:稳定排序,合并过程高效
  • 堆排序

    • 使用最大堆特性,将最大元素逐步移动到位。
    • 时间复杂度:O(n log n)
    • 优点:适合频繁提取最大元素的场景
  • 计数排序

    • 基于数值范围,统计每个数出现的次数,按顺序输出结果。
    • 时间复杂度:O(n + k)
    • 优点:适合处理整数排序
  • 桶排序

    • 将数值分成不同区间(桶),每个桶内排序后合并。
    • 时间复杂度:O(n + k log k)
    • 优点:适合对数值范围较小的场景
  • 基数排序

    • 对数值的每一位进行排序,组合成有序结果。
    • 时间复杂度:O(k n log n)
    • 优点:适合处理多位数值的场景
  • 总结

    冒泡排序通过简单的交换操作实现排序,但在较大数据量或接近有序数据时效率较低。通过优化,可以显著提高其性能。其他排序算法各有优劣,选择时需根据具体需求、数据特性和性能要求来决定。

    转载地址:http://euer.baihongyu.com/

    你可能感兴趣的文章
    pdf根据模板导出
    查看>>
    PDF调出本来存在的书签面板
    查看>>
    pdf转图片
    查看>>
    pdf转图片、提取pdf文本、提取pdf图片
    查看>>
    springCloud整合RabbitMQ实现消息中间件
    查看>>
    pdo sqlserver
    查看>>
    SpringCloud实战(十一)-更优的分布式配置解决方案(Apollo)
    查看>>
    PDO中捕获SQL语句中的错误
    查看>>
    SCP和SFTP相同点和区别
    查看>>
    peek和pop的区别
    查看>>
    Pelemay 项目教程
    查看>>
    Penetration Testing、Security Testing、Automation Testing
    查看>>
    Pentaho业务分析平台 SQL注入漏洞复现
    查看>>
    PentestGPT:一款由ChatGPT驱动的强大渗透测试工具
    查看>>
    PEP 8016 获胜,成为新的 Python 社区治理方案
    查看>>
    PEP8规范
    查看>>
    PEPM Cookie 远程代码执行漏洞复现(XVE-2024-16919)
    查看>>
    Percona Server 5.6 安装TokuDB
    查看>>
    SpringBoot(十四)整合MyBatis
    查看>>
    percona-xtrabackup 备份
    查看>>