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

Java 八大排序算法详解(从入门到面试)

一、八大排序算法总览

排序算法类型稳定性平均时间复杂度空间复杂度
冒泡排序交换稳定O(n²)O(1)
选择排序选择不稳定O(n²)O(1)
插入排序插入稳定O(n²)O(1)
希尔排序插入不稳定O(n^1.3)O(1)
归并排序归并稳定O(n log n)O(n)
快速排序交换不稳定O(n log n)O(log n)
堆排序选择不稳定O(n log n)O(1)
基数排序分配稳定O(n·k)O(n+k)

二、冒泡排序(Bubble Sort)

1. 思想

像水中的气泡一样,大的数不断“浮”到后面。

  • 每一趟比较相邻元素

  • 大的往后放

  • 一趟结束,最大值到末尾

2. Java 实现

public static void bubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { boolean flag = false; for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flag = true; } } if (!flag) break; // 优化:已排好序 } }

3. 特点

  • ✅ 稳定

  • ❌ 慢,只适合理解思想


三、选择排序(Selection Sort)

1. 思想

每一轮选择一个最小值,放到前面。

2. Java 实现

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

3. 特点

  • ❌ 不稳定

  • ❌ 比较次数固定


四、插入排序(Insertion Sort)

1. 思想

像打牌一样,把当前数插入到已排好序的部分。

2. Java 实现

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

3. 特点

  • ✅ 稳定

  • ✅ 小规模 / 基本有序非常快


五、希尔排序(Shell Sort)

1. 思想

插入排序的升级版,先分组,再插入

2. Java 实现

public static void shellSort(int[] arr) { for (int gap = arr.length / 2; gap > 0; gap /= 2) { for (int i = gap; i < arr.length; i++) { int temp = arr[i]; int j = i; while (j - gap >= 0 && arr[j - gap] > temp) { arr[j] = arr[j - gap]; j -= gap; } arr[j] = temp; } } }

六、归并排序(Merge Sort)

1. 思想

分而治之

  • 拆分数组

  • 排序子数组

  • 合并有序数组

2. Java 实现(核心)

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); } }

七、快速排序(Quick Sort)⭐

1. 思想

选一个基准值,比它小的放左边,大的放右边。

2. Java 实现

public static void quickSort(int[] arr, int left, int right) { if (left >= right) return; int pivot = arr[left]; int l = left, r = right; while (l < r) { while (l < r && arr[r] >= pivot) r--; arr[l] = arr[r]; while (l < r && arr[l] <= pivot) l++; arr[r] = arr[l]; } arr[l] = pivot; quickSort(arr, left, l - 1); quickSort(arr, l + 1, right); }

3. 特点

  • 🚀 实际中最快

  • ❗ 最坏 O(n²)


八、堆排序(Heap Sort)

1. 思想

利用大顶堆/小顶堆的结构。

2.代码实现

package com.qcby; import java.lang.reflect.Array; import java.util.Arrays; public class duiSort { public static void main(String[] args) { int arr[] = {5,7,4,2,0,3,1,6}; for(int p = arr.length-1;p>=0;p--){ sort(arr,p,arr.length); } for(int i = arr.length-1;i>=0;i--){ int temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; sort(arr,0,i); } System.out.println(Arrays.toString(arr)); } public static void sort(int arr[], int parent, int length){ int child = parent*2+1; while (child<length){ int rchild = child + 1; if(rchild<length && arr[rchild]>arr[child] ){ child++; } if(arr[parent]<arr[child] ){ int temp = arr[parent]; arr[parent] = arr[child]; arr[child] = temp; parent = child; child = parent*2+1; }else { break; } } } }

3.特点

  • 不稳定

  • 不需要额外空间


九、基数排序(Radix Sort)

1. 思想

按位排序(个位 → 十位 → 百位)

2. 特点

  • 非比较排序

  • 适合整数 / 字符串

http://www.jsqmd.com/news/89397/

相关文章:

  • 【和春笋一起学C++】(五十一)复制构造函数
  • AI如何革新漏洞扫描工具的开发流程
  • 题解:AT_abc436_f
  • 计算机毕业设计springboot餐厅预定系统 基于SpringBoot的智慧餐饮订座平台 SpringBoot驱动的线上餐厅席位预约管理系统
  • 小白程序员的进阶之路:Java大厂求职面试实录
  • mac 安装brew实战应用案例分享
  • 深入解析 DNS:互联网的隐形神经系统
  • 服务器文件管理太麻烦?宝塔 FTP+cpolar 让远程操作像本地一样简单
  • 破壁异构计算 - Ascend C在CANN全栈中的战略支点角色
  • 数字色彩的骨架:计算机如何理解颜色
  • vue基于springboot众筹平台的设计与实现_o6xzhq2s_
  • MATLAB 环境下信号的同步压缩广义 Stockwell 变换探索
  • UE5 材质-35-节点:CustomRotator 自定义旋转 节点。线性渐变节点,材质函数 LinearGradient。
  • AI大模型赋能消费升级:新机遇与新路径
  • vue基于springboot的社区健身服务_yob3w0op_
  • Web3.js钱包与账户管理
  • 【开题答辩全过程】以 基于微信小程序的失物认领系统为例,包含答辩的问题和答案
  • Ascend C算子精度调试全攻略 - 从Print函数到结构化数据比对
  • 安全体验馆好用供应商
  • Ubuntu 24 安装 fcitx5 + rime + 雾凇配置
  • vue基于springboot二手车交易和租赁平台的设计与实现_k6nb3x0d(java毕业设计项目源码)
  • 《线性代数应该这样学》学习笔记 | 第一章 向量空间
  • 详细介绍:详解如何通过 MCP 协议实现 AI 对 Chrome 的智能控制:步骤与实战用例
  • C#+VisionMaster联合开发(十二)_操作Group
  • AI弱智文章 - sunny
  • MATLAB程序设计基础
  • 初步了解Next.js
  • 密码系统
  • 2025 年 12 月防爆合格证认证公司最新推荐,聚焦资质、案例、售后的五家机构深度解读! - 品牌鉴赏师
  • 电商系统中ES检索技术设计和运用 - 实践