【排序算法】典型排序算法 Java实现

以下是典型的排序算法分类及对应的 Java 实现,包含时间复杂度、稳定性说明和核心代码示例:


一、比较类排序(通过元素比较)

1. 交换排序

① 冒泡排序
时间复杂度:O(n²)(优化后最优O(n))
稳定性:稳定

public static void bubbleSort(int[] arr) {boolean swapped;for (int i = 0; i < arr.length - 1; i++) {swapped = false;for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = true;}}if (!swapped) break; // 提前终止优化}
}

② 快速排序
时间复杂度:平均 O(n log n),最差 O(n²)
稳定性:不稳定

public static void quickSort(int[] arr, int low, int high) {if (low < high) {int pivot = partition(arr, low, high);quickSort(arr, low, pivot - 1);quickSort(arr, pivot + 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++;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;
}

2. 插入排序

① 直接插入排序
时间复杂度:O(n²)(最优O(n))
稳定性:稳定

public static void insertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}
}

3. 选择排序

① 简单选择排序
时间复杂度:O(n²)
稳定性:不稳定

public static void selectionSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {int minIdx = i;for (int j = i + 1; j < arr.length; j++) {if (arr[j] < arr[minIdx]) {minIdx = j;}}int temp = arr[minIdx];arr[minIdx] = arr[i];arr[i] = temp;}
}

4. 归并排序

时间复杂度:O(n log n)
稳定性:稳定

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

5. 堆排序

时间复杂度:O(n log n)
稳定性:不稳定

public static void heapSort(int[] arr) {// 构建最大堆for (int i = arr.length / 2 - 1; i >= 0; i--) {heapify(arr, arr.length, i);}// 逐步提取堆顶元素for (int i = arr.length - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}
}private static void heapify(int[] arr, int n, int i) {int largest = i;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) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;heapify(arr, n, largest);}
}

二、非比较类排序(利用数值特征)

1. 计数排序

时间复杂度:O(n + k)(k 为数据范围)
稳定性:稳定
适用场景:整数且范围较小

public static void countingSort(int[] arr) {int max = Arrays.stream(arr).max().getAsInt();int[] count = new int[max + 1];for (int num : arr) count[num]++;int idx = 0;for (int i = 0; i <= max; i++) {while (count[i]-- > 0) {arr[idx++] = i;}}
}

2. 基数排序

时间复杂度:O(nk)(k 为最大位数)
稳定性:稳定

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

三、总结与选择建议

算法平均时间复杂度空间复杂度稳定性适用场景
冒泡排序O(n²)O(1)稳定小数据、教学演示
快速排序O(n log n)O(log n)不稳定通用场景(优化后高效)
归并排序O(n log n)O(n)稳定大数据、稳定排序需求
堆排序O(n log n)O(1)不稳定原地排序、内存敏感场景
计数排序O(n + k)O(k)稳定整数且数值范围小
基数排序O(nk)O(n + k)稳定多位数整数(如身份证号)

实际建议

  • 小规模数据:插入排序或冒泡排序(简单实现)。
  • 通用场景:优先选择快速排序(需优化基准选择)。
  • 稳定排序需求:归并排序或基数排序。
  • 特定数值特征:计数排序/基数排序效率碾压比较排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多模态大语言模型arxiv论文略读(八十七)

MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文标题&#xff1a;MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文作者&#xff1a;Xiangyu Zhao, Xiangtai Li, Haodong Duan, Haian Huang, Yining Li, Kai Chen, Hua Ya…

塔能节能平板灯:点亮苏州某零售工厂节能之路

在苏州某零售工厂的运营成本中&#xff0c;照明能耗占据着一定比例。为降低成本、提升能源利用效率&#xff0c;该工厂与塔能科技携手&#xff0c;引入塔能节能平板灯&#xff0c;开启了精准节能之旅&#xff0c;并取得了令人瞩目的成效。 一、工厂照明能耗困境 苏州该零售工厂…

数据库事务的四大特性(ACID)

一、前言 在现代数据库系统中&#xff0c;事务&#xff08;Transaction&#xff09;是确保数据一致性和完整性的重要机制。事务的四大特性——原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;…

8 种快速易用的Python Matplotlib数据可视化方法

你是否曾经面对一堆复杂的数据&#xff0c;却不知道如何让它们变得直观易懂&#xff1f;别慌&#xff0c;Python 的 Matplotlib 库是你数据可视化的最佳伙伴&#xff01;它简单易用、功能强大&#xff0c;能将枯燥的数字变成引人入胜的图表。无论是学生、数据分析师还是程序员&…

springboot 控制层调用业务逻辑层,注入报错,无法自动装配 解决办法

报错&#xff1a; 解决&#xff1a;愿意是业务逻辑层&#xff0c;即service层的具体实现类没有加注解Service导致的&#xff0c;加上解决了&#xff01;&#xff01;

如何提高独立服务器的安全性?

独立服务器相对于其它服务器来说&#xff0c;整体的硬件设备都是独立的同时还有着强大的服务器性能&#xff0c;其中CPU设备能够决定着服务器的运算能力&#xff0c;所以独立服务器的安全性受到企业格外的重视&#xff0c;严重的话会给企业造成巨大的资金损失。 那么&#xff0…

关于 Web 风险点原理与利用:6. 逻辑风险点

一、分类&#xff1a; 1.1 越权访问 **越权访问&#xff08;Authorization Bypass&#xff09;**是指&#xff1a;攻击者绕过了权限控制机制&#xff0c;访问或操作了非其权限范围内的资源或功能。 换句话说&#xff0c;系统该拦你没拦&#xff0c;你就越权成功了。 1.1.1 …

分布式缓存:ZSET → MGET 跨槽(cross‐slot)/ 并发 GET解决思路

文章目录 缓存全景图Pre问题描述解决思路一、管道&#xff08;Pipelining&#xff09;替代多线程二、使用 Hash Tag 保证数据同槽三、用 Hash 结构一次性批量取值四、把数据直接存进 ZSET&#xff08;或用 RedisJSON&#xff09; 小结 缓存全景图 Pre 分布式缓存&#xff1a;缓…

开发AR导航助手:ARKit+Unity+Mapbox全流程实战教程

引言 在增强现实技术飞速发展的今天&#xff0c;AR导航应用正逐步改变人们的出行方式。本文将手把手教你使用UnityARKitMapbox开发跨平台AR导航助手&#xff0c;实现从虚拟路径叠加到空间感知的完整技术闭环。通过本教程&#xff0c;你将掌握&#xff1a; AR空间映射与场景理…

助力 FPGA 国产化,ALINX 携多款方案亮相深圳、广州“紫光同创 FPGA 技术研讨会”

5 月中旬&#xff0c;一年一度的紫光同创技术研讨会系列活动正式拉开帷幕&#xff0c;相继在深圳、广州带来 FPGA 技术交流盛宴。 ALINX 作为紫光同创官方合作伙伴&#xff0c;长期助力推动 FPGA 国产化应用发展&#xff0c;此次携多款基于 Kosmo-2 系列产品开发的方案 demo 亮…

LeetCode 1040.移动石子直到连续II

在 X 轴上有一些不同位置的石子。给定一个整数数组 stones 表示石子的位置。 如果一个石子在最小或最大的位置&#xff0c;称其为 端点石子。每个回合&#xff0c;你可以将一颗 端点石子 拿起并移动到一个未占用的位置&#xff0c;使得该石子不再是一颗 端点石子。 值得注意的…

梯度优化提示词:精准引导AI分类

基于梯度优化的提示词工程方法,通过迭代调整提示词的嵌入向量,使其能够更有效地引导模型做出正确分类。 数据形式 训练数据 train_data 是一个列表,每个元素是一个字典,包含两个键: text: 需要分类的文本描述label: 对应的标签(“冲动"或"理性”)示例数据: …

JavaWeb:SpringBoot配置优先级详解

3种配置 打包插件 命令行 优先级 SpringBoot的配置优先级决定了不同配置源之间的覆盖关系&#xff0c;遵循高优先级配置覆盖低优先级的原则。以下是详细的优先级排序及配置方法说明&#xff1a; 一、配置优先级从高到低排序 1.命令行参数 优先级最高&#xff0c;通过keyvalu…

使用CentOS部署本地DeekSeek

一、查看服务器的操作系统版本 cat /etc/centos-release二、下载并安装ollama 1、ollama下载地址&#xff1a; Releases ollama/ollama GitHubGet up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 3, Mistral Small 3.1 and other large language models. - Re…

Matplotlib 后端与事件循环

前言&#xff1a;很多时候&#xff0c;matplot跑出来的是这种静态非交互的&#xff0c;如果想要可以交互&#xff0c;就得设定一个后端&#xff0c;例如 matplotlib.use(TkAgg)Matplotlib 后端 (Backend) Matplotlib 的设计理念是能够以多种方式输出图形&#xff0c;无论是显…

【JAVA】中文我该怎么排序?

&#x1f4d8; Java 中文排序教学文档&#xff08;基于 Collator&#xff09; &#x1f9e0; 目录 概述Java 中字符串排序的默认行为为什么需要 Collator使用 Collator 进行中文排序升序 vs 降序排序自定义对象字段排序多字段排序示例总结对比表附录&#xff1a;完整代码示例 …

k8s-NetworkPolicy

在 Kubernetes 中&#xff0c;NetworkPolicy 是一种资源对象&#xff0c;用于定义 Pod 之间的网络通信策略。它允许你控制哪些 Pod 可以相互通信&#xff0c;以及如何通信。通过使用 NetworkPolicy&#xff0c;可以实现更细粒度的网络访问控制&#xff0c;增强集群的安全性。 1…

LAN(局域网)和WAN(广域网)

你的问题非常清晰&#xff01;我来用一个直观的比喻实际拓扑图帮你彻底理解LAN&#xff08;局域网&#xff09;和WAN&#xff08;广域网&#xff09;如何协同工作&#xff0c;以及路由器在其中的位置。你可以把整个网络想象成一座城市&#xff1a; 1. 比喻&#xff1a;城市交通…

idea 插件开发自动发布到 nexus 私服中(脚本实例)

如下脚本内容为 idea 插件开发项目中的 build.gradle.kts 文件示例&#xff0c;其中自定了 updatePluginsXmlToNexus 和 uploadPluginToNexus 两个任务&#xff0c;一个用来自动修改 nexus 中的配置文件&#xff0c;一个用来自动将当前插件打包后的 zip 文件上传到 nexus 私服中…

SpringBoot-11-基于注解和XML方式的SpringBoot应用场景对比

文章目录 1 基于注解的方式1.1 @Mapper1.2 @select1.3 @insert1.4 @update1.5 @delete2 基于XML的方式2.1 namespace2.2 resultMap2.3 select2.4 insert2.5 update2.6 delete3 service和controller3.1 service3.2 controller4 注解和xml的选择如果SQL简单且项目规模较小,推荐使…