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

Java排序算法详解

在Java编程中,排序算法是数据处理和算法设计中的基础且重要的部分。它们广泛应用于各种场景,如数据库管理、数据分析、图形界面排序等。掌握几种常见的排序算法对于提升程序效率和优化性能至关重要。本文将详细解析几种经典的Java排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序,并探讨它们的原理、实现方式及适用场景。

冒泡排序(Bubble Sort)

冒泡排序是最简单的排序算法之一,通过重复遍历待排序的数列,比较每对相邻元素的值,若发现顺序错误则交换它们的位置。这个过程就像水中的气泡一样逐渐“浮”到数列的顶端(即排序的末端),因此得名冒泡排序。冒泡排序实现简单,但效率较低,特别是对于大数据集来说,其时间复杂度为O(n^2),其中n是数列的长度。

public void bubbleSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换arr[j]和arr[j+1]int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}
选择排序(Selection Sort)

选择排序算法的基本思想是:在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的时间复杂度同样是O(n^2),但在某些情况下(如数据交换次数较少时)可能比冒泡排序更优。

public 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;}}// 交换arr[i]和arr[minIndex]int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}
}
插入排序(Insertion Sort)

插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在小数据集上表现优异,时间复杂度最好情况下为O(n),平均和最坏情况下为O(n^2)。

public void insertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int key = arr[i];int j = i - 1;/* 将arr[i]插入到arr[0...i-1]中已排序的序列中 */while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}
}
快速排序(Quick Sort)

快速排序是一种分治策略的排序算法,它通过选择一个“基准”元素,将待排序的数组分割成两个子数组,一个包含所有小于基准值的元素,另一个包含所有大于基准值的元素,然后递归地对这两个子数组进行快速排序。快速排序的平均时间复杂度为O(n log n),但在最坏情况下(如输入数组已经有序)会退化到O(n^2)。

public void quickSort(int[] arr, int low, int high) {if (low < high) {// pi是partition的位置,arr[pi]现在位于正确的位置int pi = partition(arr, low, high);// 分别对pi左右两边的子数组进行递归排序quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}// 分区操作,返回pivot元素的

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Easysearch 性能测试方法概要
  • 《纳瓦尔宝典》-- 读书笔记
  • 深度学习与神经网络戴做讲解
  • 第1章-04-Chrome及Chrome Driver安装及测试
  • JavaScript 文件上传详解与实现
  • pytorch深度学习基础 8 (使用PyTorch的内置功能和默认参数来构建和训练一个简单的线性模型)
  • (贪心) LeetCode 45. 跳跃游戏 II
  • pandas and sqlalchemy compatibility
  • Open3D 最近点约束的体素滤波(35)
  • 手动与自动修复mfc140u.dll丢失的解决方法,mfc140u.dll在电脑中是什么样的存在
  • PLINQ:C#中并行查询的加速引擎
  • 会话跟踪方案:Cookie Session Token
  • 9 正则表达式:Java爬虫和正则表达式、String中的正则表达式方法(基本语法7)
  • 巡检机器人的使用方法和维护保养
  • 矢量数据创建
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Asm.js的简单介绍
  • ES6简单总结(搭配简单的讲解和小案例)
  • HTML-表单
  • jquery ajax学习笔记
  • js中forEach回调同异步问题
  • LeetCode算法系列_0891_子序列宽度之和
  • MobX
  • MYSQL 的 IF 函数
  • MySQL的数据类型
  • nodejs实现webservice问题总结
  • oschina
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 阿里云Kubernetes容器服务上体验Knative
  • 从伪并行的 Python 多线程说起
  • 官方解决所有 npm 全局安装权限问题
  • 力扣(LeetCode)357
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端_面试
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用Swoole加速Laravel(正式环境中)
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 用Canvas画一棵二叉树
  • 再谈express与koa的对比
  • 栈实现走出迷宫(C++)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 阿里云ACE认证学习知识点梳理
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #android不同版本废弃api,新api。
  • #Linux(make工具和makefile文件以及makefile语法)
  • #知识分享#笔记#学习方法
  • $.ajax()方法详解
  • (7)STL算法之交换赋值
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制