java实现排序算法(上)
排序算法
冒泡排序
时间和空间复杂度

要点
- 每轮冒泡不断地比较比较相邻的两个元素,如果它们是逆序的,则需要交换它们的位置
- 下一轮冒泡,可以调整未排序的右边界,减少不必要比较
代码
public static int[] test(int[] array) {// 外层循环控制遍历次数for (int i = 0; i < array.length; i++) {// 内层循环控制每轮比较和交换for (int j = 0; j < array.length - i - 1; j++) {// 比较相邻两元素大小if (array[j] > array[j + 1]) {// 交换元素位置int temp = array[j + 1];array[j + 1] = array[j];array[j] = temp;}}}// 返回排序后的数组return array;
}
测试结果
public static void main(String[] args) {int[] array = {3,1,2,4,7,9};int[] ary = test(array);System.out.println(Arrays.toString(ary));}

选择排序
时间和空间复杂度

要点
- 每一轮选择,找出最大(最小)的元素,并把它交换到合适的位置
代码
public static int[] test(int[] array) {// 外循环遍历数组元素for (int i = 0; i < array.length; i++) {// 内循环从当前元素的下一个元素开始比较for (int j = i+1; j < array.length; j++) {// 如果前一个元素大于后一个元素,交换它们的位置if(array[i] > array[j]){int temp = array[j];array[j] = array[i];array[i] = temp;}}}// 返回排序后的数组return array;}
测试结果
public static void main(String[] args) {int[] array = {3,1,2,4,7,9};int[] ary = test(array);System.out.println(Arrays.toString(ary));}

堆排序
时间和空间复杂度

要点(如果这里看不懂的话,是需要去了解大顶堆这个数据结构的)
- 建立大顶堆
- 每次将堆顶元素最大值,交换到末尾,调整堆顶元素,让它重新符合大顶堆特性
代码
import java.util.Arrays;public class Heap {int[] array; // 存储堆元素的数组int size; // 堆的大小public Heap(int capacity) {this.array = new int[capacity];}public Heap(int[] array){this.array = array;this.size = array.length;heapify(); // 调用堆化方法,构建堆}/*** 建立堆*/private void heapify() {// 建立堆的过程实际上是找到最后一个非叶子节点for (int i = size/2-1; i >=0 ; i--) {// 接下来的循环中,i 是当前非叶子节点的索引down(i); // 对当前非叶子节点进行下潜操作,保证满足堆的性质}}// 下潜操作private void down(int i) {int left = i * 2 + 1; // 左子节点索引int right = left + 1; // 右子节点索引int max = i; // 初始化最大值索引为当前节点// 判断左子节点是否存在且大于当前节点if (left < size && array[left] > array[max]) {max = left;}// 判断右子节点是否存在且大于当前节点if (right < size && array[right] > array[max]) {max = right;}if (max != i) {// 交换当前节点与最大值节点swap(max, i);// 递归调用下潜操作,保证交换后的子树仍然满足堆的性质down(max);}}// 交换数组中两个位置的元素private void swap(int a, int b) {int temp = array[a];array[a] = array[b];array[b] = temp;}
}public static void main(String[] args) {int[] array = {1,2,3,4,5,6,7};Heap heap = new Heap(array);// 堆排序while (heap.size > 1) {// 将堆顶元素与堆尾元素交换heap.swap(0, heap.size - 1);// 堆大小减一heap.size--;// 对交换后的堆顶元素进行下潜操作,保证仍然满足堆的性质heap.down(0);}System.out.println(Arrays.toString(heap.array));
}
测试结果

插入排序
时间和空间复杂度

要点
- 将数组分为两部分[0----low-1][low----a.length-1]
- 左边[0-----low-1]是已排序部分
- 右边[low------a.length-1]是未排序部分
- 每次从未排序区域取出low位置的元素,插入到已排序区域
代码
public static int[] test(int[] array) {// 外层循环,从数组第二个元素开始for (int low = 1; low < array.length; low++) {// 记录当前元素值int t = array[low];// 从当前元素的前一个位置开始向前查找插入位置int i = low - 1;while (i >= 0 && t < array[i]) {// 如果当前元素小于已排序元素,将已排序元素后移一位array[i + 1] = array[i];i--;}// 找到插入位置,将当前元素插入if (i != low - 1) {array[i + 1] = t;}}// 返回排序后的数组return array;}
测试结果
public static void main(String[] args) {int[] array = {3,1,2,4,7,9};int[] ary = test(array);System.out.println(Arrays.toString(ary));}

希尔排序
时间和空间复杂度

要点
- 简单来说,就是分组实现插入,魅族元素间隙称为hap
- 每轮排序之后gap逐渐变小,直到gap为1完成排序
- 对插入排序的优化,让元素更快地交换到最终位置

代码
public static int[] test(int[] array) {// 此时的gap就是间隙for (int gap = array.length >> 1; gap >= 1 ; gap = gap >> 1) {for (int low = gap; low < array.length ; low++) {// 记录当前位置的元素值int t = array[low];// 初始化比较位置为当前位置的前一个位置int i = low - gap;// 当比较位置合法且当前元素值小于比较位置的元素值时进行插入排序while (i >= 0 && t < array[i]){// 将比较位置的元素往后移动gap个位置array[i + gap] = array[i];// 更新比较位置为前一个gap位置i -= gap;}// 如果实际插入位置不是当前位置的前一个gap位置,则进行插入操作if (i != low - gap){array[i + gap] = t;}}}// 返回排序后的数组return array;}
测试结果
public static void main(String[] args) {int[] array = {3,1,2,4,7,9};int[] ary = test(array);System.out.println(Arrays.toString(ary));}

相关文章:
java实现排序算法(上)
排序算法 冒泡排序 时间和空间复杂度 要点 每轮冒泡不断地比较比较相邻的两个元素,如果它们是逆序的,则需要交换它们的位置下一轮冒泡,可以调整未排序的右边界,减少不必要比较 代码 public static int[] test(int[] array) {// 外层循环控制遍历次数for (int i 0; i <…...
「算法」滑动窗口
前言 算法需要多刷题积累经验,所以我行文重心在于分析解题思路,理论知识部分会相对简略一些 正文 滑动窗口属于双指针,这两个指针是同向前行,它们所夹的区间就称为“窗口” 啥时候用滑动窗口? 题目涉及到“子序列…...
Windows11(非WSL)安装Installing llama-cpp-python with GPU Support
直接安装,只支持CPU。想支持GPU,麻烦一些。 1. 安装CUDA Toolkit (NVIDIA CUDA Toolkit (available at https://developer.nvidia.com/cuda-downloads) 2. 安装如下物件: gitpythoncmakeVisual Studio Community (make sure you install t…...
rtt设备io框架面向对象学习-脉冲编码器设备
目录 1.脉冲编码器设备基类2.脉冲编码器设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.脉冲编码器设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的pulse_encoder.h定义…...
华为OD机试真题- 攀登者2-2024年OD统一考试(C卷)
题目描述: 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。地图表示为一维数组,数组的索引代表水平位置,数组的高度代表相对海拔高度。其中数组元素0代表地面。例如[0,1,4,3,1,0,0,1,2,3,1,2,1,0], 代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5和8,9,1…...
19.Qt 组合框的实现和应用
目录 前言: 技能: 内容: 1. 界面 2.槽 3.样式表 参考: 前言: 学习QCombox控件的使用 技能: 简单实现组合框效果 内容: 1. 界面 在ui编辑界面找到input widget里面的comboBoxÿ…...
【Linux】进程地址空间的理解
进程地址空间的理解 一,什么是程序地址空间二,页表和虚拟地址空间三,为什么要有进程地址空间 一,什么是程序地址空间 在我们写程序时,都会有这样下面的内存结构,来存放变量和代码等数据。 一个进程要执行…...
【Jvm】类加载机制(Class Loading Mechanism)原理及应用场景
文章目录 Jvm基本组成一.什么是JVM类的加载二.类的生命周期阶段1:加载阶段2:验证阶段3:准备阶段4:解析阶段5:初始化 三.类初始化时机四.类加载器1.引导类加载器(Bootstrap Class Loader)2.拓展类…...
Spring AOP的实现方式
AOP基本概念 Spring框架的两大核心:IoC和AOP AOP:Aspect Oriented Programming(面向切面编程) AOP是一种思想,是对某一类事情的集中处理 面向切面编程:切面就是指某一类特定的问题,所以AOP可…...
Linux------环境变量
目录 前言 一、环境变量 二、添加PATH环境变量 三、HOME环境变量 四、查看所有环境变量 1.指令获取 2.代码获取 2.1 getenv 2.2main函数的第三个参数 2.3 全局变量environ 五、环境变量存放地点 六、添加自命名环境变量 七、系统环境变量具有全局属性 八、环境变…...
计算机视觉所需要的数学基础
计算机视觉领域中使用的数学知识广泛而深入,以下是一些关键知识点及其在计算机视觉中的应用: 线性代数: - 矩阵运算:用于图像的表示和处理,如图像旋转、缩放、裁剪等。 - 向量空间:用于描述图像中的…...
ChatGPT魔法1: 背后的原理
1. AI的三个阶段 1) 上世纪50~60年代,计算机刚刚产生 2) Machine learning 3) Deep learning, 有神经网络, 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…...
【c/c++】获取时间
在一些应用的编写中我们有时候需要用到时间,或者需要一个“锚点”来确定一些数的值。在c/c中有两个用来确定时间的函数:time/gettimeofday 一、time time_t time(time_t *timer);time 函数返回当前时间的时间戳(自 1970 年 1 月 1 日以来经…...
uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)
方案:使用u-parse的selectable属性 <u-parse :selectable"true" :html"content"></u-parse> 注意:u-parse直接使用是不兼容小程序的,需要对u-parse进行改造: 1. 查看u-parse源码发现小程序走到以…...
常见的几种Web安全问题测试简介
Web项目比较常见的安全问题 1.XSS(CrossSite Script)跨站脚本攻击 XSS(CrossSite Script)跨站脚本攻击。它指的是恶意攻击者往Web 页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web 里面的html 代码会被执行,从而达到恶意用户的特殊…...
linux信号机制[一]
目录 信号量 时序问题 原子性 什么是信号 信号如何产生 引入 信号的处理方法 常见信号 如何理解组合键变成信号呢? 如何理解信号被进程保存以及信号发送的本质? 为什么要有信号 信号怎么用? 样例代码 core文件有什么用呢&#…...
elementui 中el-date-picker 选择年后输出的是Wed Jan 01 2025 00:00:00 GMT+0800 (中国标准时间)
文章目录 问题分析 问题 在使用 el-date-picker 做只选择年份的控制器时,出现如下问题:el-date-picker选择年后输出的是Wed Jan 01 2025 00:00:00 GMT0800 (中国标准时间),输出了两次如下 分析 在 el-date-picker 中,我们使用…...
Redis 集群(Cluster)
集群概念 Redis 的哨兵模式,提高了系统的可用性,但是正在用来存储数据的还是 master 和 slave 节点,所有的数据都需要存储在单个 master 和 salve 节点中。 如果数据量很大,接近超出了 master / slave 所在机器的物理内存&#…...
260.【华为OD机试真题】信道分配(贪心算法-JavaPythonC++JS实现)
🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-信道分配二.解题思路三.题解代码Python题解代码…...
Python打发无聊时光:3.实现简单电路的仿真
看到这个标题肯定有人会问:好好的multisim、 proteus之类的专门电路仿真软件不用,非要写一个简陋的python程序来弄,是不是精神失常了。实际上,我也不知道为什么要这么干,前两篇文章是我实际项目中的一些探索࿰…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
