详细介绍:java中常见的几种排序算法

news/2025/9/21 10:10:40/文章来源:https://www.cnblogs.com/ljbguanli/p/19103241

详细介绍:java中常见的几种排序算法

手动实现的排序算法(共 10 种常见)

这些是你在学习数据结构与算法时会接触到的经典排序方法。虽然不推荐用于生产环境,但面试常考,必须掌握。

✅ 1. 冒泡排序(Bubble Sort)

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]) {
// 交换
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}

✅ 2. 选择排序(Selection Sort)

  • 原理:每次找最小元素,放到已排序部分末尾。
  • 时间复杂度:O(n²)
  • 稳定性:❌ 不稳定
public static void selectionSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIdx]) {
minIdx = j;
}
}
swap(arr, i, minIdx);
}
}

✅ 3. 插入排序(Insertion Sort)

  • 原理:像打扑克牌,每次将新元素插入到已排序部分的正确位置。
  • 时间复杂度: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;
}
}

✅ 4. 快速排序(Quick Sort)

  • 原理:分治法,选一个“基准”,小的放左,大的放右,递归排序。
  • 时间复杂度:平均 O(n log n),最坏 O(n²)
  • 稳定性:❌ 不稳定(但可改造为稳定)
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
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++;
swap(arr, i, j);
}
}
swap(arr, i + 1, high);
return i + 1;
}

✅ 5. 归并排序(Merge Sort)

  • 原理:分治 + 合并,递归拆分,再合并有序数组。
  • 时间复杂度:O(n log n)(始终稳定)
  • 稳定性:✅ 稳定
  • Java 内部 TimSort 的基础
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
private static void merge(int[] arr, int l, int m, int r) {
// 合并两个有序子数组
int[] temp = new int[r - l + 1];
int i = l, j = m + 1, k = 0;
while (i <= m && j <= r) {
temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
}
while (i <= m) temp[k++] = arr[i++];
while (j <= r) temp[k++] = arr[j++];
System.arraycopy(temp, 0, arr, l, temp.length);
}

✅ 6. 堆排序(Heap Sort)

  • 原理:利用大顶堆,每次取最大值放到末尾。
  • 时间复杂度:O(n log n)
  • 稳定性:❌ 不稳定
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;
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) {
swap(arr, i, largest);
heapify(arr, n, largest);
}
}

✅ 7. 希尔排序(Shell Sort)

  • 原理:插入排序的改进版,先按 gap 分组排序,逐步缩小 gap。
  • 时间复杂度:O(n log n) ~ O(n²),取决于 gap 序列
  • 稳定性:❌ 不稳定

✅ 8. 计数排序(Counting Sort)


✅ 9. 桶排序(Bucket Sort)

  • 原理:将数据分到多个“桶”,每个桶内排序,再合并。
  • 时间复杂度:平均 O(n),前提是数据均匀分布
  • 稳定性:✅ 稳定(如果桶内排序稳定)

✅ 10. 基数排序(Radix Sort)


排序算法对比表

算法时间复杂度(平均)最坏空间稳定性适用场景
冒泡排序O(n²)O(n²)O(1)学习、小数据
选择排序O(n²)O(n²)O(1)学习
插入排序O(n²)O(n²)O(1)小数组、几乎有序
快速排序O(n log n)O(n²)O(log n)通用(Java 基本类型)
归并排序O(n log n)O(n log n)O(n)稳定排序、外部排序
堆排序O(n log n)O(n log n)O(1)堆结构学习
计数排序O(n + k)O(n + k)O(k)小范围整数
桶排序O(n)O(n²)O(n)数据均匀分布
基数排序O(d·(n+k))O(d·(n+k))O(n+k)字符串、整数

✅ 总结:Java 中的排序方法有几种?

分类数量说明
内置排序方法4 种Arrays.sort(), Collections.sort(), List.sort(), Stream.sorted()
手动实现算法10 种冒泡、选择、插入、快排、归并、堆、希尔、计数、桶、基数

✅ 所以严格来说,Java 中常见的排序方法有 14 种以上


使用建议

场景推荐方法
生产环境排序Arrays.sort() / List.sort()
面试手写排序快排、归并、冒泡(至少掌握 3 种)
小数组优化插入排序(JDK 内部也用)
稳定排序需求归并、TimSort

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

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

相关文章

Linux 内核VRF

Linux 内核VRFVirtual Routing and Forwarding (VRF) 由路由表+网络设备组成。 加载vrf内核模块 modprobe vrf 基本操作 # 创建并拉起vrf设备 # 自动创建路由表1 ip link add vrf1 type vrf table 1 ip link set dev v…

使用FFmpeg转换m4a

在Linux下可以使用FFmpeg将m4a文件转换为mp3文件,如下 ffmpeg -i input.m4a -vn -acodec libmp3lame -ab 320k output.mp3其中-i 是输入文件 -vn 是不包括视频 -acodec libmp3lame 是指定 LAME MP3 解编码器 -ab 320k…

提升多屏监控体验/新增辅屏预览功能/轻松实现跨屏实时监控/支持高达500路多个屏幕同时显示

一、前言说明 随着监控系统规模的不断扩大,以及用户对多屏协同操作需求的日益增长,如何高效、灵活地预览大量实时视频通道,成为提升用户体验的关键。尤其是在拥有多个显示器的环境中,用户越来越希望能够在不同屏幕…

[Java SE/文件系统/IO] 核心源码精讲:java.io.File

1 概述:java.io.File Java 流(Stream)、文件(File)和IOJava 中的流(Stream)、文件(File)和 IO(输入输出)是处理数据读取和写入的基础设施它们允许程序与外部数据(如文件、网络、系统输入等)进行交互。java.io…

Linux 内核整体架构详解

Linux 内核整体架构详解Linux 内核是操作系统的核心,其精妙的设计使得它能够高效地管理硬件资源,并为上层应用程序提供稳定的运行环境。下面我将为你详细解析 Linux 内核的结构,包括其整体架构、核心子系统、模块化…

Ubuntu 磁盘扩容与扩容失败障碍解决( df -h 与 GParted 显示空间不一致的问题 -LVM)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

httplb 服务器

#include <iostream> #include "httplib.h" using namespace std; using namespace httplib; int main(){Server svr;svr.Get("/",[](const Request& req,Response& res){res.s…

atoi() - 字符串( ASCLL )转换为整数( int )

引言 atoi() 函数是 C 标准库中用于将字符串(ASCII 字符串)转换为整数(int 类型)的核心函数,其名称是 “ASCII to Integer” 的缩写。 一、基本信息 函数原型 #include <stdlib.h> // 必须包含的头文件 in…

02.Python:Flash初步使用

python,flask前端处理:Vue+Axios Flash:后端框架,默认端口 5000 需要注意:get与post方法,对应的传参与取参方式 --------------<!DOCTYPE html> <html lang="en"><head><meta cha…

解决Kubernetes集群中master节点无法与node节点通信的策略

检查基础网络连接: 使用 ping命令检测节点间网络连通性。若无法ping通,可能是云服务的安全组或本地防火墙规则限制,需对安全组规则和防火墙规则(如iptables)进行审查。 ping <node-IP-address>验证kubelet服…

从高版本的sqlserver向低版本的sqlserver上复制表和数据的方法

今天要从一台sqlserver 2016的电脑上把数据库复制到一台装有sqlserver2012的服务器上,使用备份加还原的时候报错,提示不支持,导出sql语句的方式也没有成功,用navicat也没成功。方法如下: 在目标服务器上打开SQL S…

【ROS2】 忽略局域网多机通信导致数据接收的bug - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

在Ubuntu18.04安装兼容JDK 8的Eclipse集成开发环境

更新系统包列表:首先,打开终端,并执行以下命令以更新Ubuntu系统的包列表: sudo apt update安装Java开发工具包 (JDK 8):在终端中运行以下命令安装OpenJDK 8: sudo apt install openjdk-8-jdk 安装完毕后,运行下…

【php】带数组的文件列表生成,返回数组

【php】带数组的文件列表生成,返回数组$list = gen_files_list(D:/novel/); for($i = 0; $i < count($lis); $i++) {echo "<li><a href=" . htmlspecialchars($lis[$i]) . ">" . …

配置Nginx以支持Websocket连接的方法

安装Nginx:首先,确保您安装了最新版本的Nginx,因为Websocket支持通常在较新版本中表现更佳。设置HTTP升级头:当Websocket客户端请求与服务器建立连接时,它会发送一个HTTP请求,请求中含有 Upgrade: websocket和 C…

Extundelete工具恢复数据

Extundelete 是一款专为 Ext 文件系统(Linux 系统中最常用的文件系统,如 Ext3、Ext4)设计的开源数据恢复工具,核心功能是恢复被意外删除(通过 rm 命令等操作)但尚未被新数据覆盖的文件或目录。它基于文件系统的底…

最新!!!MySQL环境搭建(windows系统) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

重新理解12306:它卖的从来不是“库存”,而是“状态”

你是否也曾好奇,12306这个每逢节假日就承受亿级流量的系统,背后到底是如何工作的?一个常见的误解是:把它当作淘宝一样的电商系统,认为它管理的是简单的商品库存。但真相远非如此。 让我们做一个极端的假设:一列高…

基于Python+Vue开发的房产销售管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的房产销售管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于…

WinSCP从Windows传文件到Linux,文件名为中文显示乱码

View PostWinSCP从Windows传文件到Linux,文件名为中文显示乱码1、登录界面,录入服务器地址、用户名、密码,点击【Advanced】2、设置UTF-8 encoding for filenames为on即可,默认为Auto