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程序来弄,是不是精神失常了。实际上,我也不知道为什么要这么干,前两篇文章是我实际项目中的一些探索࿰…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...