当前位置: 首页 > article >正文

Java排序算法百科全书:原理、实现与实战指南

一、排序算法全景视图

1. 算法分类体系

graph TDA[排序算法] --> B[比较排序]A --> C[非比较排序]B --> B1[基本排序]B1 --> B11[冒泡排序]B1 --> B12[选择排序]B1 --> B13[插入排序]B --> B2[高效排序]B2 --> B21[快速排序]B2 --> B22[归并排序]B2 --> B23[堆排序]B2 --> B24[希尔排序]B --> B3[混合排序]B3 --> B31[TimSort]B3 --> B32[内省排序]C --> C1[计数排序]C --> C2[桶排序]C --> C3[基数排序]

2. 核心指标对比表

算法平均时间复杂度最差时间复杂度空间复杂度稳定性最佳适用场景
冒泡排序O(n²)O(n²)O(1)稳定教学演示/小数据集
快速排序O(n log n)O(n²)O(log n)不稳定通用场景
归并排序O(n log n)O(n log n)O(n)稳定大数据量/外部排序
堆排序O(n log n)O(n log n)O(1)不稳定实时系统/内存敏感
希尔排序O(n log²n)O(n²)O(1)不稳定中等规模数据
计数排序O(n + k)O(n + k)O(k)稳定小范围整数
桶排序O(n + k)O(n²)O(n + k)稳定均匀分布数据
基数排序O(nk)O(nk)O(n + k)稳定多关键字排序
TimSortO(n log n)O(n log n)O(n)稳定Java对象排序

二、基础比较排序实现

1. 冒泡排序(Bubble Sort)

算法特点:简单直观,适合教学演示
优化技巧:提前终止标志位+记录最后交换位置

public static void optimizedBubbleSort(int[] arr) {int n = arr.length;int lastSwap = n - 1;for (int i = 0; i < n-1; i++) {boolean isSorted = true;int currentSwap = 0;for (int j = 0; j < lastSwap; j++) {if (arr[j] > arr[j+1]) {swap(arr, j, j+1);isSorted = false;currentSwap = j;}}lastSwap = currentSwap;if (isSorted) break;}
}

2. 插入排序(Insertion Sort)

最佳场景:小数据集或基本有序数据
优化方案:二分查找插入位置

public static void insertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int key = arr[i];int pos = binarySearch(arr, 0, i-1, key);System.arraycopy(arr, pos, arr, pos+1, i-pos);arr[pos] = key;}
}private static int binarySearch(int[] arr, int low, int high, int key) {while (low <= high) {int mid = (low + high) >>> 1;if (arr[mid] < key) low = mid + 1;else high = mid - 1;}return low;
}

三、高效分治排序实现

1. 快速排序(Quick Sort)

核心优化:三数取中+三路划分+小数组切换

public static void quickSort(int[] arr) {quickSort(arr, 0, arr.length-1);
}private static void quickSort(int[] arr, int low, int high) {if (high - low < 47) { // 小数组优化insertionSort(arr, low, high);return;}// 三数取中法选择基准int m = medianOfThree(arr, low, (low+high)>>>1, high);swap(arr, low, m);// 三路划分int lt = low, gt = high, i = low+1;int pivot = arr[low];while (i <= gt) {if      (arr[i] < pivot) swap(arr, lt++, i++);else if (arr[i] > pivot) swap(arr, i, gt--);else              i++;}quickSort(arr, low, lt-1);quickSort(arr, gt+1, high);
}

2. 归并排序(Merge Sort)

迭代优化版:避免递归开销+内存复用

public static void mergeSort(int[] arr) {int n = arr.length;int[] temp = new int[n];for (int size = 1; size < n; size *= 2) {for (int left = 0; left < n; left += 2*size) {int mid = Math.min(left+size-1, n-1);int right = Math.min(left+2*size-1, n-1);merge(arr, temp, left, mid, right);}}
}private static void merge(int[] arr, int[] temp, int left, int mid, int right) {System.arraycopy(arr, left, temp, left, right-left+1);int i = left, j = mid+1, k = left;while (i <= mid && j <= right) {arr[k++] = (temp[i] <= temp[j]) ? temp[i++] : temp[j++];}while (i <= mid) arr[k++] = temp[i++];
}

四、非比较排序实现

1. 计数排序(Counting Sort)

适用场景:数据范围小的整数排序
负数处理:偏移量调整

public static void countingSort(int[] arr) {int max = Arrays.stream(arr).max().getAsInt();int min = Arrays.stream(arr).min().getAsInt();int range = max - min + 1;int[] count = new int[range];int[] output = new int[arr.length];for (int num : arr) count[num - min]++;for (int i = 1; i < range; i++) count[i] += count[i-1];for (int i = arr.length-1; i >= 0; i--) {output[count[arr[i]-min]-1] = arr[i];count[arr[i]-min]--;}System.arraycopy(output, 0, arr, 0, arr.length);
}

2. 基数排序(Radix Sort)

LSD实现:支持负数处理

public static void radixSort(int[] arr) {int max = Arrays.stream(arr).max().getAsInt();int min = Arrays.stream(arr).min().getAsInt();max = Math.max(max, -min);for (int exp = 1; max/exp > 0; exp *= 10) {countingSortByDigit(arr, exp);}
}private static void countingSortByDigit(int[] arr, int exp) {int n = arr.length;int[] output = new int[n];int[] count = new int[19]; // -9到9for (int num : arr) {int digit = (num / exp) % 10 + 9;count[digit]++;}for (int i = 1; i < 19; i++) count[i] += count[i-1];for (int i = n-1; i >= 0; i--) {int digit = (arr[i]/exp) % 10 + 9;output[--count[digit]] = arr[i];}System.arraycopy(output, 0, arr, 0, n);
}

五、高级混合排序

1. TimSort

核心特性:Java对象排序默认算法

// Java内置实现原理
static <T> void timSort(T[] a, Comparator<? super T> c) {int n = a.length;int minRun = minRunLength(n);// 1. 分割Run并扩展for (int i=0; i<n; i+=minRun) {int end = Math.min(i+minRun, n);binaryInsertionSort(a, i, end, c);}// 2. 合并相邻Runfor (int size=minRun; size<n; size*=2) {for (int left=0; left<n; left+=2*size) {int mid = left + size;int right = Math.min(left+2*size, n);merge(a, left, mid, right, c);}}
}

2. 堆排序(Heap Sort)

迭代实现:避免递归深度限制

public static void heapSort(int[] arr) {int n = arr.length;// 建堆for (int i = n/2-1; i >= 0; i--)heapify(arr, n, i);// 排序for (int i = n-1; i > 0; i--) {swap(arr, 0, i);heapify(arr, i, 0);}
}private static void heapify(int[] arr, int n, int i) {int largest = i;while (true) {int left = 2*i + 1;int right = 2*i + 2;if (left < n && arr[left] > arr[largest]) largest = left;if (right < n && arr[right] > arr[largest])largest = right;if (largest == i) break;swap(arr, i, largest);i = largest;}
}

六、排序算法选择指南

决策树

需要稳定排序?
├── 是 → 数据范围小?
│       ├── 是 → 计数排序(整数) / 桶排序(浮点)
│       └── 否 → 归并排序 / TimSort
└── 否 → 内存敏感?├── 是 → 堆排序 / 原地快排└── 否 → 快速排序 / 内省排序

性能优化要点

  1. 数据特征分析:规模、分布、有序度

  2. 硬件特性利用:缓存优化、并行计算

  3. 混合策略:结合不同算法优势

  4. 预处理:检测有序子序列


七、实战应用场景

  1. 数据库索引:B+树的有序存储

  2. 实时计算:滑动窗口中位数计算

  3. 大数据处理:MapReduce排序阶段

  4. 图形渲染:深度缓冲排序优化

// 实时中位数计算示例
class MedianFinder {private PriorityQueue<Integer> minHeap = new PriorityQueue<>();private PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());public void addNum(int num) {if (maxHeap.isEmpty() || num <= maxHeap.peek()) {maxHeap.offer(num);} else {minHeap.offer(num);}// 平衡堆if (maxHeap.size() > minHeap.size() + 1) {minHeap.offer(maxHeap.poll());} else if (minHeap.size() > maxHeap.size()) {maxHeap.offer(minHeap.poll());}}public double findMedian() {if (maxHeap.size() == minHeap.size()) {return (maxHeap.peek() + minHeap.peek()) / 2.0;} else {return maxHeap.peek();}}
}

总结与扩展方向

核心原则

  1. 没有绝对最优:根据场景选择合适算法

  2. 理解数据特征:是优化排序性能的关键

  3. 混合策略:往往能获得最佳实践效果

进阶方向

  • 分布式排序:研究MapReduce的排序机制

  • GPU加速排序:利用并行计算特性

  • 机器学习排序:神经网络预测最优顺序

通过系统掌握各类排序算法的原理与Java实现,开发者能够根据具体场景选择最优解决方案,并具备定制化优化排序性能的能力。排序算法作为计算机科学的基石,其思想方法将持续影响未来技术的发展方向。

相关文章:

Java排序算法百科全书:原理、实现与实战指南

一、排序算法全景视图 1. 算法分类体系 graph TDA[排序算法] --> B[比较排序]A --> C[非比较排序]B --> B1[基本排序]B1 --> B11[冒泡排序]B1 --> B12[选择排序]B1 --> B13[插入排序]B --> B2[高效排序]B2 --> B21[快速排序]B2 --> B22[归并排序]B…...

开源脚本分享:用matlab处理ltspice生成的.raw双脉冲数据

Author :PNJIE DATE: 2025/04/21 V0.0 前言 该项目旨在使用Matlab处理LTspice的.raw文件&#xff0c;包括动态计算和绘图&#xff0c;部分脚本基于LTspice2Matlab项目&#xff1a; PeterFeicht/ltspice2matlab: LTspice2Matlab - 将LTspice数据导入MATLAB github地址&#x…...

(二)mac中Grafana监控Linux上的MySQL(Mysqld_exporter)

框架&#xff1a;GrafanaPrometheusMysqld_exporter 一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装&#xff08;mac&#xff09;-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录…...

c++基础·列表初始化

目录 一、列表初始化的核心优势 二、基础数据类型与数组初始化 1. 基础类型初始化 2. 数组初始化 三、类与结构体初始化 1. 构造函数匹配规则 2. 注意事项 四、标准容器初始化 五、聚合类型&#xff08;Aggregate Types&#xff09;初始化 1. 聚合类型定义 2. 初始化…...

RK3588上编译opencv 及基于c++实现图像的读入

参考博文&#xff1a; https://blog.csdn.net/qq_47432746/article/details/147203889 一、安装依赖包 sudo apt install build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpe…...

论文阅读:2025 arxiv AI Alignment: A Comprehensive Survey

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Alignment: A Comprehensive Survey 人工智能对齐&#xff1a;全面调查 https://arxiv.org/pdf/2310.19852 https://alignmentsurvey.com/ https://www.doubao.com/cha…...

element-ui中的上传组件el-upload非自动上传监听不到success

当设置了:auto-upload"false" 监听不到success回调 要用自定义请求去监听 :http-request"requestUploadFile" //设置 auto-upload为false&#xff0c;要自定义请求http-request //:auto-upload"false" //:http-request"requestUploadFi…...

Git创建空分支并推送到远程仓库

new-empty-branch是新分支的名称 完全空提交&#xff08;Git 2.23&#xff09;【推荐】 git switch --orphan new-empty-branch git config user.email "youexample.com" git config user.name "Your Name" git commit --allow-empty -m "初始空提交…...

Github中项目的公开漏洞合集

前言 最近在搜CVE的时候&#xff0c;意外发现了GitHub Security Advisories。 可能对一些人来说&#xff0c;已经是老东西了。但我还是第一次见到。 觉得挺好用的&#xff0c;就分享出来。 GitHub Security Advisories GitHub Security Advisories 是 GitHub 提供的一项重要…...

蚂蚁全媒体总编刘鑫炜再添新职,出任共工新闻社新媒体研究院院长

2025年4月18日&#xff0c;共工新闻社正式宣布聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院院长。此次任命标志着刘鑫炜在新媒体领域的专业能力与行业贡献再次获得权威机构认可。 刘鑫炜深耕新媒体领域多年&#xff0c;曾担任中国新闻传媒集团新媒体研究院院长、蚂蚁全媒体总编等职…...

吴恩达强化学习复盘(2)K-Means初始化|K的选择|算法优化

K-Means初始化 K-Means 算法的第一步是随机选择位置作为初始聚类中心&#xff08;new one through newk&#xff09;&#xff0c;但如何进行随机猜测是需要探讨的问题。一般需要多次尝试初始猜测&#xff0c;以期望找到更好的聚类结果。 K 值选择及初始聚类中心选取方法 K 值…...

SQL优化案例分享 | PawSQL 近日推出 Lateral Join 重写优化算法

一、Lateral 查询语法介绍 Lateral 查询是SQL中的一种连接方式&#xff0c;它允许FROM子句中的子查询引用同一FROM子句中前面的表的列。虽然这种特性提供了强大的表达能力&#xff0c;但在某些场景下可能导致性能问题。PawSQL优化器近日实现了一种针对特定类型Lateral Join的重…...

电子电器架构 ---软件定义汽车的电子/电气(E/E)架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

ONLYOFFICE协作空间3.1发布:虚拟数据房间中基于角色的表单填写、房间模板、改进访客管理等

全新升级的 ONLYOFFICE 协作空间有着约 40 项新功能和改进&#xff0c;将您的文档协作和管理体验提升到全新高度。阅读本文&#xff0c;了解所有优化功能。 关于 ONLYOFFICE ONLYOFFICE 是一个国际开源项目&#xff0c;专注于高级和安全的文档处理&#xff0c;可提供文本文档、…...

Docker如何更换镜像源提高拉取速度

在国内&#xff0c;由于网络政策和限制&#xff0c;直接访问DockerHub速度很慢&#xff0c;尤其是在拉取大型镜像时。为了解决这个问题&#xff0c;常用的方法就是更换镜像源。本文将详细介绍如何更换Docker镜像源&#xff0c;并提供当前可用的镜像源。 换源方法 方法1&#x…...

深入理解 HTML5 Web SQL 数据库:用法、现状与替代方案

一、引言 在 Web 开发的领域中,客户端存储一直是一个关键的话题。HTML5 带来了多种客户端存储的解决方案,其中 Web SQL 数据库曾经是一个备受关注的选项。尽管如今它已被废弃,但了解其原理、使用方法以及为何被替代,对于 Web 开发者来说仍然具有重要的意义。本文将深入探讨…...

【C++教程】C++中为什么优先使用 cout/cin流

在 C 中&#xff0c;优先使用 cout/cin 流而非 C 风格的 printf/scanf&#xff0c;主要出于以下设计理念和实际优势&#xff1a; 1. 类型安全&#xff08;Type Safety&#xff09; cout/cin 是类型安全的 流操作符&#xff08;<< 和 >>&#xff09;通过运算符重载自…...

示波器探头状态诊断与维护技术指南

一、探头性能劣化特征分析 信号保真度下降 ・时域表现&#xff1a;上升沿时间偏离标称值15%以上&#xff08;如1ns探头测得≥1.15ns&#xff09; ・频域特性&#xff1a;-3dB带宽衰减超过探头标称值20%基准稳定性异常 ・直流偏置电压漂移量&#xff1e;5mV&#xff08;预热30分…...

【 Git 全局忽略文件完全指南:配置、规则与最佳实践】

Git 全局忽略文件完全指南&#xff1a;配置、规则与最佳实践 前言 在软件开发过程中&#xff0c;我们经常遇到一些不需要被版本控制系统追踪的文件&#xff0c;例如IDE配置文件、编译生成的中间文件、日志文件等。虽然可以在每个项目中创建.gitignore文件&#xff0c;但对于开…...

FreeRTOS互斥信号量解决优先级翻转实战教程

FreeRTOS互斥信号量解决优先级翻转实战教程 大家好&#xff01;今天我们来深入探讨FreeRTOS中的优先级翻转问题&#xff0c;并通过互斥信号量来解决这个问题。上一篇文章我们已经了解了优先级翻转的现象&#xff0c;今天我们将动手实践&#xff0c;通过代码对比来直观感受互斥…...

第一篇:从哲学到管理——实践论与矛盾论如何重塑企业思维

引言&#xff1a;当革命哲学照亮现代商业 1937年&#xff0c;毛泽东在战火中写就的《实践论》《矛盾论》&#xff0c;为中国共产党提供了认识世界的方法论。今天&#xff0c;这两部著作正成为企业破解管理困局的“思维操作系统”&#xff1a; 战略模糊&#xff1a;据Gartner统…...

14.电容的高频特性在EMC设计中的应用

电容的高频特性在EMC设计中的应用 1. 电容自谐振频率特性对EMC的作用2. 退耦电容的选型3. Y电容选型注意事项4. 储能电容与电压跌落的瞬时中断5. 穿心电容对EMC滤波的作用 1. 电容自谐振频率特性对EMC的作用 电容的高频特性等效模型如下&#xff1a; 其自谐振成因如下&#x…...

网络编程4

day4 一、Modbus 1.分类 (1).Modbus RTU: 运行在串口上的协议&#xff0c;采用二进制表现形式以及紧凑型数据结构&#xff0c;通信效率高&#xff0c;应用广泛。(2).Modbus ASCII: 运行在串口上的协议&#xff0c;采用ASCII码传输&#xff0c;并且利用特殊字符作为其字节的开始…...

Java 性能优化:如何利用 APM 工具提升系统性能?

Java 性能优化&#xff1a;如何利用 APM 工具提升系统性能&#xff1f; 在当今竞争激烈的软件开发领域&#xff0c;系统性能至关重要。随着应用规模的扩大和用户需求的增加&#xff0c;性能问题逐渐凸显&#xff0c;这不仅影响用户体验&#xff0c;还可能导致业务损失。而 APM…...

AI音乐解决方案:1分钟可切换suno、udio、luno、kuka等多种模型,suno风控秒切换 | AI Music API

你有没有觉得&#xff0c;suno风控来了&#xff0c;就要停服了&#xff1f; 你有没有觉得&#xff0c;对接多种音乐模型&#xff0c;让你很疲乏&#xff1f; 你有没有觉得&#xff0c;音乐模型&#xff0c;中文咬字不清楚&#xff0c;让你很苦恼&#xff1f; 别怕&#xff0…...

一键升级OpenSSH/OpenSSL修复安全漏洞

在服务器安全运维过程中&#xff0c;我们经常面临这样的问题&#xff1a;收到高危漏洞通报&#xff08;如最近的OpenSSH多个CVE漏洞&#xff09;&#xff0c;但Ubuntu系统无法通过apt直接升级到修复版本。这种情况下&#xff0c;传统方法需要手动编译源码&#xff0c;处理依赖关…...

健康养生,开启新生活

在饮食上&#xff0c;应遵循 “均衡搭配、清淡少盐” 的原则。主食不要只吃精米白面&#xff0c;可适当加入燕麦、糙米等全谷物&#xff0c;为身体补充膳食纤维&#xff1b;每天保证一斤蔬菜半斤水果&#xff0c;深色蔬菜如菠菜、西兰花富含维生素与矿物质&#xff0c;水果则选…...

VLAN间通讯技术

多臂路由 路由器使用多条物理线路&#xff0c;每条物理线路充当一个 VLAN 的网管 注意&#xff1a;路由器对端的交换机接口&#xff0c;需要设定 Access 类型&#xff0c;因为路由器的物理接口无法处理 VLAN 标签 。 单臂路由 使用 以太网子接口 (sub-interface) 实现。 …...

利用Stream和OpenAI构建基于RAG的AI客服聊天机器人

利用Stream和OpenAI构建基于RAG的AI客服聊天机器人 尽管大语言模型经过海量数据训练,但其领域专业知识仍有限。这一局限使其在需要特定数据的客服聊天机器人等应用中表现欠佳。 检索增强生成(RAG)通过让大语言模型访问外部知识源来生成更精准的响应,有效解决了这一问题。…...

Easysearch Rollup 相比 OpenSearch Rollup 的优势分析

背景 在处理时序数据时&#xff0c;Rollup 功能通过数据聚合显著降低存储成本&#xff0c;并提升查询性能。Easysearch 与 OpenSearch 均提供了 Rollup 能力&#xff0c;但在多个关键维度上&#xff0c;Easysearch Rollup 展现出更优的表现。本文将从查询体验、索引管理、聚合…...