当前位置: 首页 > 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.cnnetsun.cn/news/53419.html

相关文章:

  • 安全体验馆好用供应商
  • 第二章——数据分析场景之Python数据可视化:用Matplotlib与Seaborn绘制洞察之图
  • 【Java毕设全套源码+文档】基于springboot的高校毕业生离校管理系统小程序设计与实现(丰富项目+远程调试+讲解+定制)
  • 如何用AI工具jstat优化Java应用性能分析
  • 【Java毕设全套源码+文档】基于springboot的高校毕业生信息管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • Day 38 GPU训练及类的call方法
  • 【Python实战】火爆全网的“隔空手势画板”是如何实现的?教你用OpenCV+MediaPipe复刻钢铁侠黑科技!
  • 【学习笔记】如果打造可复现、可评测、可迭代的AI技术体系
  • 【论文自动阅读】See Once, Then Act: Vision-Language-Action Model with Task Learning from One-Shot Video Demo
  • 利用齐次坐标系证明各种几何定理【射影几何】
  • 小程序基于springboot的乡镇普法知识科普宣传系统 律师预约系统设计与实现_qf4cwws6(java毕业设计项目源码)
  • 面向对象编程三大特性:封装、继承、多态的核心要义
  • leetcode 2147. 分隔长廊的方案数 困难
  • 学生党必备!这款桌面课表工具太省心了
  • 深度学习实验14代码
  • 优化及性能-–-behaviac
  • 练题100天——DAY26:汇总区间+丢失的数字+数组交集
  • 当AI芯片不再性感:博通的高增长,为何成了催命符?
  • Vibe Coding:AI驱动的编程新范式
  • AI 数字孪生工厂:西门子与中信特钢的实践,如何降本 11%?
  • Spring IoC的实现机制是什么?
  • 耐用折叠屏手机推荐:三星Galaxy Z TriFold如何破解“折痕与耐用”难题?
  • 前端技术风险防控:以防为主,防控结合
  • 给女神发“在吗”,她回了个表情包是几个意思?—— 硬核探讨TCP 三次握手
  • 入门大模型必知的100个基础问题(附简明答案)
  • vue基于Spring Boot的建筑材料管理系统的应用和研究_ug8y52z3
  • 【大模型】-LangChain--RAG文档系统
  • 探索非线性电液伺服系统的模型自适应反步控制
  • 降AI率就要牺牲文笔?WriterPro第一个不服!实测对比比原文写得还好,这文笔简直绝了
  • 我不是这样