常用的排序算法(Java版)

embedded/2025/1/13 12:17:42/

文章目录

  • 前言
  • 一、选择排序
  • 二、插入排序
  • 三、冒泡排序
  • 四、快速排序
  • 五、归并排序
  • 六、希尔排序
  • 七、堆排序
  • 总结


前言

算法>排序算法有很多,这里列出最常用的一些,如选择排序、插入、冒泡等。

稳定性:待排序数据中有相同的数,排序之后相同的数与排序前的前后位置关系不变,则成为稳定算法>排序算法
比如我们有一组数据2,9,3,4,8,3;按照大小排序之后就是2,3,3,4,8,9;两个3的前后顺序在排序前后保持不变,即稳定。


一、选择排序

最佳时间复杂度平均时间复杂度最坏时间复杂度稳定性空间复杂度
O(N^2)O(N^2)O(N^2)不稳定O(1)

代码:

java">  public void selectSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {int min = i;for (int j = i + 1; j < arr.length; j++) {if (arr[min] > arr[j]) {min = j;}}if (min != i) {swap(arr, i, min);}}}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

二、插入排序

最佳时间复杂度平均时间复杂度最坏时间复杂度稳定性空间复杂度
O(N)O(N^2)O(N^2)稳定O(1)

代码:

java">    public void insertSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int insertNote = arr[i];int j = i - 1;//前一个元素的下标while (j >= 0 && insertNote < arr[j]) {arr[j + 1] = arr[j];j--;}arr[j + 1] = insertNote;}}

三、冒泡排序

最佳时间复杂度平均时间复杂度最坏时间复杂度稳定性空间复杂度
O(N)O(N^2)O(N^2)稳定O(1)

代码:

java">    public void bubbleSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {boolean swapped = false;for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {swap(arr, j, j + 1);swapped = true;}}if (!swapped) {break;}}}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

四、快速排序

最佳时间复杂度平均时间复杂度最坏时间复杂度稳定性空间复杂度
O(NlogN)O(NlogN)O(N^2)不稳定O(logN)

代码:

java">  public void quickSort(int[] arr) {quick(arr, 0, arr.length - 1);}private void quick(int[] arr, int low, int high) {if (low < high) {int pivot = arr[high]; int pivotIndex = low;for (int j = low; j < high; j++) {if (arr[j] < pivot) {swap(arr, pivotIndex++, j);}}swap(arr, pivotIndex, high);quick(arr, low, pivotIndex - 1);quick(arr, pivotIndex + 1, high);}}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

五、归并排序

最佳时间复杂度平均时间复杂度最坏时间复杂度稳定性空间复杂度
O(NlogN)O(NlogN)O(NlogN)稳定O(N)

代码:

java">public void mergeSort(int[] arr) {mergeSort(arr, 0, arr.length - 1, new int[arr.length]);}private void mergeSort(int[] array, int lo, int hi, int[] aux) {if (lo < hi) {int mid = lo + (hi - lo) / 2;mergeSort(array, lo, mid, aux);mergeSort(array, mid + 1, hi, aux);merge(array, lo, mid, hi, aux);}}private void merge(int[] arr, int lo, int mid, int hi, int[] aux) {if (hi - lo + 1 >= 0) {System.arraycopy(arr, lo, aux, lo, hi - lo + 1);}int leftStartIndex = lo;int rightStartIndex = mid + 1;for (int k = lo; k <= hi; k++) {if (leftStartIndex > mid) {//如果左边元素没了, 直接将右边的剩余元素都合并到到原数组中arr[k] = aux[rightStartIndex++];} else if (rightStartIndex > hi) {//如果右边元素没有了,直接将所有左边剩余元素都合并到原数组中arr[k] = aux[leftStartIndex++];} else if (aux[leftStartIndex] < aux[rightStartIndex]) {//如果左边比右边小,则将左边的元素拷贝到原数组中arr[k] = aux[leftStartIndex++];} else {arr[k] = aux[rightStartIndex++];}}}

六、希尔排序

最佳时间复杂度平均时间复杂度最坏时间复杂度稳定性空间复杂度
O(N)O(N^(3/2))O(N^S)(1<S<2)不稳定O(1)

代码:

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

七、堆排序

最佳时间复杂度平均时间复杂度最坏时间复杂度稳定性空间复杂度
堆排序O(NlogN)O(NlogN)O(NlogN)不稳定

代码:

java">  public void heapSort(int[] arr) {log.info("TopMax = {}", top(arr, 5, true));log.info("TopMin = {}", top(arr, 5, false));}private int[] top(int[] input, int topN, boolean topMax) {int[] result = Arrays.copyOf(input, topN);for (int i = 0; i < topN; i++) {int currentIndex = i;while (currentIndex != 0 && topMax ? result[parentIndex(currentIndex)] > result[currentIndex] : result[parentIndex(currentIndex)] < result[currentIndex]) {swap(result, currentIndex, currentIndex = parentIndex(currentIndex));}}for (int i = topN; i < input.length; i++) {if (topMax) {//大顶堆if (input[i] > result[0]) {result[0] = input[i];int from = 0;while ((leftIndex(from) < topN && result[from] > result[leftIndex(from)])|| (rightIndex(from) < topN && result[from] > result[rightIndex(from)])) {if (rightIndex(from) < topN && result[leftIndex(from)] > result[rightIndex(from)]) {swap(result, from, from = rightIndex(from));} else {swap(result, from, from = leftIndex(from));}}}} else {//小顶堆if (input[i] < result[0]) {result[0] = input[i];int from = 0;while ((leftIndex(from) < topN && result[from] < result[leftIndex(from)])|| (rightIndex(from) < topN && result[from] < result[rightIndex(from)])) {if (rightIndex(from) < topN && result[leftIndex(from)] < result[rightIndex(from)]) {swap(result, from, from = rightIndex(from));} else {swap(result, from, from = leftIndex(from));}}}}}return result;}private static int parentIndex(int i) {return (i - 1) / 2;}private static int leftIndex(int i) {return 2 * i + 1;}private static int rightIndex(int i) {return 2 * i + 2;}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

总结

算法>排序算法最佳时间复杂度平均时间复杂度最坏时间复杂度稳定性空间复杂度
选择排序O(N^2)O(N^2)O(N^2)不稳定O(1)
插入排序O(N)O(N^2)O(N^2)稳定O(1)
冒泡排序O(N)O(N^2)O(N^2)稳定O(1)
快速排序O(NlogN)O(NlogN)O(N^2)不稳定O(logN)
归并排序O(NlogN)O(NlogN)O(NlogN)稳定O(N)
希尔排序O(N)O(N^(3/2))O(N^S)(1<S<2)不稳定O(1)
堆排序O(NlogN)O(NlogN)O(NlogN)不稳定O(1)

http://www.ppmy.cn/embedded/153561.html

相关文章

“迎新系统”与“智慧”的融合:构建高效、便捷的新生入学体验

于当今之社会&#xff0c;“智慧教育”业已成为助推教育现代化之重要趋向。在此种背景之下&#xff0c;“迎新系统”身为高校迎新工作之核心环节&#xff0c;其智能化水准径直影响着新生之入学体验以及校园管理之效能。传统意义上的迎新工作&#xff0c;通常牵涉大量的信息收集…

【优选算法篇】:深入浅出位运算--性能优化的利器

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;优选算法篇–CSDN博客 文章目录 一.位运算一.位运算概述二.常见的位运算操作符三.常见的位运…

3. 使用springboot做一个音乐播放器软件项目【封装项目使用的工具类】

上一章文章 我们做了 音乐播放器这个项目的 框架搭建和一些基础配置文件。 参考网址&#xff1a; https://blog.csdn.net/Drug_/article/details/145044096 这篇文章我们来分享一些 项目中用到的一些工具类。 一般项目里 我会创建一个 utils 文件夹 来存放 项目中常用的工具类…

Rust 生命周期

Rust 生命周期 引言 Rust 是一种系统编程语言,以其内存安全、并发性和高性能而闻名。在 Rust 中,生命周期是一个核心概念,用于确保引用的有效性,从而防止内存安全问题。本文将深入探讨 Rust 的生命周期,包括其工作原理、使用场景以及最佳实践。 生命周期基础 什么是生…

UnityDots学习(三)

此篇记录Dots使用的步骤。 Demo逻辑是在场景内创建2000个物体。1000个是搜索&#xff0c;1000是被搜索的目标。 每个物体都随机朝某个方向移动。 在Update里。1000个搜索者会对1000被搜索的目标进行遍历查找到哪个目标离他最近&#xff0c;并且画出连线。 逻辑如下&#xf…

《分布式光纤测温:解锁楼宇安全的 “高精度密码”》

在楼宇建筑中&#xff0c;因其内部空间庞大&#xff0c;各类电器设施众多&#xff0c;如何以一种既高效又稳定&#xff0c;兼具低成本与高覆盖特性的方式&#xff0c;为那些关键线路节点开展温度监测&#xff0c;是目前在安全监测领域一项重点研究项目&#xff0c;而无锡布里渊…

QT 端口扫描附加功能实现 端口扫描5

上篇QT 下拉菜单设置参数 起始端口/结束端口/线程数量 端口扫描4-CSDN博客 在扫描结束后设置Scan按钮为可用&#xff0c;并提示扫描完成 在 MainWindow 类中添加一个成员变量来跟踪正在进行的扫描任务数量&#xff1a; 在 MainWindow 的构造函数中初始化 activeScanTasks&…

深入理解 Java 设计模式之策略模式

一、引言 在 Java 编程的世界里&#xff0c;设计模式就如同建筑师手中的蓝图&#xff0c;能够帮助我们构建出更加健壮、灵活且易于维护的代码结构。而策略模式作为一种经典的行为型设计模式&#xff0c;在诸多实际开发场景中都发挥着至关重要的作用。它能够让算法的定义与使用…