仅使用一个局部变量对数组进行排序

LabVIEW实战:基于DAQmx的实时正弦波生成、采集与波形图动态显示 本文详细介绍了如何使用LabVIEW和DAQmx驱动实现实时正弦波的生成、采集与动态显示。通过USB-6008数据采集卡,结合队列缓冲机制和动态波形图显示技术,构建了一个完整的信号处理系统。文章包含硬件连接、软件配置、任务设置及常见问题排查,适合LabVIEW初学者和硬件控制开发者参考。 阅读详情


数组排序是经常被问到的一个技术问题。实现这一功能的排序算法有很多,比如冒泡,选择,快排,归并等等。我们经常被问到阐述这些算法,但很少有人这样问:如何在你的算法中仅定义一个局部变量实现数组的排序。

实际上冒泡排序可以实现这一点,传统的冒泡排序需要三个局部变量,一个i变量做索引,一个布尔变量用于判断是否继续排序,一个temp变量用于交换两个值。下面是冒泡排序的代码示例:

<span style="font-size:14px;">function bubbleSort(arr) {
    do {
        var isSwapped = false;
        for(var i = 0; i < arr.length - 1; ++i) {
            if(arr[i] > arr[i + 1]) {
                var temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
                isSwapped = true;
            }
        }
    } while (isSwapped);    
}</span>
在这段代码里,三个变量分别是:i,isSwapped,temp。只允许使用一个局部变量,那么需要把isSwapped,temp消除。

首先我们来看temp,使用亦或运算的方法就可以消除这个变量,代码示例如下:

<span style="font-size:14px;">var x = 5, y = 6;
x = x^y;
y = x^y;
x = x^y;</span>
接下来要去除的是布尔变量isSwapped,实际上这个变量只是用来标记数组中所有的元素是否已经是有序的。所以可以用索引变量i来代替这个变量。其实我们只需要判断数组长度,每次排序之后判断索引是否小于arr.length-1,知道索引等于arr.length-1结束排序。修改后的代码如下:

<span style="font-size:14px;">function bubbleSort(arr) {
    do {
        for(var i = 0; i < arr.length - 1; ++i) {
            if(arr[i] > arr[i + 1]) {
                arr[i] = arr[i] ^ arr[i + 1];
                arr[i + 1] = arr[i] ^ arr[i + 1];
                arr[i] = arr[i] ^ arr[i + 1];
                break;
            }
        }
    } while (i < arr.length - 1);    
}</span>

实际上,这段代码还可以再优化,只需要一层循环即可实现,在每一次交换过后将索引i重置,直到i等于arr.length-1。优化后代码如下:

<span style="font-size:14px;">function bubbleSort(arr) {
    for(var i = 0; i < arr.length - 1; ++i) {
        if(arr[i] > arr[i + 1]) {
            arr[i] = arr[i] ^ arr[i + 1];
            arr[i + 1] = arr[i] ^ arr[i + 1];
            arr[i] = arr[i] ^ arr[i + 1];
            i = -1;
        }
    }
}</span>
快乐的享受编程~~



PD3.0详解 协议的时序timer和counter计数 前面介绍了关于PD协议的交互,还有协议层数据各个字段的含义,但是一直没有系统的说关于协议的时序,还有部分counter,就是协议允许发送的次数,或者一些其他计数。 大师匈今天说一下关于这方面的东西,这些东西都是非常关键的东西,但是相对来说PD标准内对时序的要求还是比较宽泛,非常容易能够实现这样的要求。 Timer 1、CRCReceiveTimer 0.9~1.1ms 表示每次通信收到goodcrc的时间,必须在这个时间内收到goodcrc, 我们要注意不是在0.9~1.1ms内,而是第三方可以在这个范 阅读详情

相关推荐

【FPGA】DDR3调试总结

DDR3管脚根据不同的功能可以分为:数据组、地址组、控制组和电源组。如图上所示,共96个管脚。

m0_51679724的博客 4967

关于Java中针对类中某个值的排序方法

对于一般的数组的排序: int[] a={1,4,-1,5,0}; Arrays.sort(a); for(int i=0;i&lt;a.length;i++) System.out.print(a[i]+" "); 关于针对类中某个值的排序: 创建了一个学生类包括学生的序号和名字,我针对类中的学生序号进行排序: 方法一:利用list import java.util.*;...

辞树 1054

基于FPGA的函数信号发生器设计

设计采用波形查找表和相位累加器的方法实现DDS,查找表的数据位宽为8位,采样点数为4096。波形产生范围是100Hz-20MHz,最小频率间隔为1Hz,用8个数码管显示频率,可产生正弦波、方波、三角波,波形用两个led显示,select信号控制,全灭为正弦波,一亮一灭为方波,全亮为锯齿波。为了使频率和相位便于调节,用3个拨码开关控制步进,用8个led显示状态。

FPGA入门到跑路 5636

选择排序算法

      选择排序算法 1.原理 选择排序和冒泡排序类似,但是选择排序是采用一个变量来接受 最小值的下标,因此每一趟比较只需要交换一次数组元素即可。 2.举例 数组a[]={21,3,44,22},用选择排序算法升序排序。 设置一个...

weixin_34410662的博客 143

网络工程师的Python入门实战:手把手教你写交换机配置备份脚本

本文详细介绍了如何利用Python为网络工程师开发一个高效的交换机配置备份脚本,涵盖环境搭建、设备连接方案、智能设备发现、多因素认证、异常处理、配置差异对比等关键步骤。通过实战案例展示如何将备份时间从4小时缩短至15分钟,显著提升运维效率,特别适用于华为交换机等设备的配置导出与备份需求。

weixin_30291791的博客 304

Dobot Magician机械臂二次开发指南:如何利用Python脚本和I/O接口实现自动化任务

本文详细介绍了Dobot Magician机械臂的二次开发方法,重点讲解如何通过Python脚本和I/O接口实现高级自动化任务。内容包括开发环境搭建、运动控制API解析、I/O接口应用以及典型场景实现,帮助开发者充分发挥Dobot Magician的潜力,适用于工业自动化、教育科研等领域。

weixin_26968079的博客 267

Java Array 部分元素排序

Arrays.sort()函数原型 Arrays.sort(Array array, int fromIndex, int toIndex, Comparator comparator); public static void main(String[] args) { Integer[] a = new Integer[]{8, 3, 9, 7, 1}; Arrays.sort(...

weixin_45744426的博客 1938

MUSIC算法翻车?Toeplitz矩阵重构如何解决DOA估计中的相干信源难题

本文深入探讨了MUSIC算法在相干信源DOA估计中失效的根本原因,并详细介绍了基于Toeplitz矩阵重构的协方差矩阵修复技术。该方法通过凸优化恢复协方差矩阵的理想结构,有效解决了信号子空间秩亏损问题,从而显著提升了MUSIC算法在相干和多径场景下的分辨精度与稳健性。

a2b3c4d5e的博客 250

Java中Arrays.sort()的三种常用用法(自定义排序规则)

Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序。 举例如下: import java.util.Arrays; public class Main { public static void main(String[] args) { int[] a = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5}; Arrays.sort(a); for(int i = 0

ssjdoudou的博客 11万+

LAMMPS GCMC模拟保姆级教程:从fix gcmc命令到吸附等温线实战

本文提供LAMMPS GCMC模拟的详细教程,从fix gcmc命令设置到吸附等温线实战,涵盖巨正则蒙特卡洛模拟的全流程。通过MOF-5吸附甲烷的案例,指导用户构建模拟体系、转换化学势与压力、定义GCMC区域,并绘制出版级吸附等温线,助力材料科学研究。

weixin_33724046的博客 604

人工智能训练师三级·模型生命周期真题40题|训练→评估→调优全链路通关

本文为人工智能训练师三级考试真题解析系列第2篇,聚焦模型生命周期全链路(训练→评估→调优)。内容包含40道精选真题,覆盖数据划分、模型训练、评估指标、超参数调优4个核心阶段。重点考察:1)数据集的合理划分方法(留出法、交叉验证);2)模型训练的基本原理;3)关键评估指标(准确率、召回率、F1等)的应用场景;4)超参数调优技术(网格搜索、随机搜索等)。通过真题解析帮助考生系统掌握模型生命周期的闭环迭代方法论,提升从数据准备到模型优化的全流程实践能力。适合备考人工智能训练师三级认证的考生学习参考。

白话机器学习 90

Vue前台警告You may have an infinite update loop in watcher with expression

今天在使用 Vue 开发过程中,前台控制台报了一个警告,经过一番百度,最终解决了问题,过程如下。 //控制台报错信息 vue.runtime.esm.js?2b0e:619 [Vue warn]: You may have an infinite update loop in watcher with expression "value" 控制台信息 控制台警告错误如图: 原因 报错是因为我要给 v-for 里边的一个数组类型的 item 排序,如果是普通的绑定,用计算属性是搞定的。然而,这个牵

符忻潼 1万+

YOLOv12优化:原创自研 | 带有注意力机制的隐藏状态混合器的状态空间(HSM-SSD),实现暴力涨点 | CVPR2025 EfficientViM

可以将 带有注意力机制的隐藏状态混合器的状态空间(HSM-SSD)中的注意力机制换成专栏其他注意力机制 ,那么你就能实现独一无二的原创。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 664

23、匿名类的排序、Lambda 表达式、方法引用_java 排序匿名函数

的时候,可以使用 Lambda 表达式简化代码的书写(但是匿名类和 Lambda 在作用域上还是有点区别的)☘️ 通过该方法还可对数组进行倒顺序排序,这就需要通过匿名类语法传入排序逻辑了。✏️ 当只有一个参数的时候:可以省略小括号(一个参数都没有的时候不能省略小括号)方法中可以指定是降序还是升序)【具体看上面的代码】✏️ 当只有一条语句的时候:可以省略大括号、分号和。的接口(可以包含多个默认方法和静态方法)(若那个唯一的抽象方法没有参数,可不写)进行降序排序的时候使用到的。的局部变量(和匿名类一样)

2401_89192000的博客 226

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

主元排序法c语言程序,初级c,,,编写一个使用类模板对数组进行排序,查找并求元素和的程序.doc...

初级c,,,编写一个使用类模板对数组进行排序,查找并求元素和的程序初级c,,,编写一个使用类模板对数组进行排序,查找并求元素和的程序篇一:第七章作业内容(修改后带部分答案)一. 选择题1. 下列关于类模板中模板参数的叙述中,错误的是(D)A.模板参数可以作为数据成员的类型B.模板参数可以作为成员函数的返回类型C.模板参数可以作为成员函数的参数类型D.模板参数不能作为成员函数的局部变量类型2. 假设...

weixin_35713233的博客 994

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

2013年8月20日、关键字this|操作数组(对数组工具对象建立,静态中使用,文档注释)|单例设计模式

/* 当成员变量和局部变量重名,可以用关键字this来区分。 this : 代表对象。代表哪个对象呢?当前对象。   this就是所在函数所属对象的引用。   简单说:哪个对象调用了this所在的函数,this就代表哪个对象。 this也可以用于在构造函数中调用其他构造函数。 注意:只能定义在构造函数的第一行。因为初始化动作要先执行。 */ class Pe

王振州、与Java共存亡! 667

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数组指针封装函数实现冒泡排序的功能

使用数组指针封装一个函数,对一组数据实现冒泡排序

weixin_41454263的博客 557

DNA排序

这道题和我讲的上一道题一样“求逆序对数”,这道题也是求逆序对数,所以也要用上一道题的归并排序函数(用来求逆序对数量) 我们上一道题编是的数字,这道题是字符串,我们就要把函数改了吗? 其实并不需要,因为我们可以新建立一个int数组,存的是输入字符串的int强制转换过的数字(也就是ASCII码),然后放入这个函数中来求逆序对数就行了,然后用一个变量存下来。 因为存字符串的int强制转换的ASCII码用一次就行了,所以不需要一直存下来,就可以写一个局部变量!

wo_ai_luo_的博客 1060

OC之block使用场合

block是苹果最推崇的语法,IOS4.0之后的类都添加了block支持。block通常当参数来使用 下面让我们了解一下block的使用方法:

IT李菜鸟的博客 730

2020/8/6 QQ1017871939 一维数组和冒泡排序

8.6小白学习数组(一维数组) 这是正常编写代码的时候。记住数组的下标是从0开始,而不是1开始,这里我们虽然定义了30,这里的30是30个元素的意思。因为从0开始,所以达到的是29,而不是30.所以我们数组下标写30是错误的,越界的! 我来图片表示一下为什么数组下标从0开始。 如果出现数组下标为负数或者越界的时候。 就会出现编译正确而抛出异常的问题。Exception in thread “main” java.lang.Ar...

ok1017871939的博客 140

求逆序对数

问题: 对于一组数,若i且Ai>Aj,则就是一个“逆序对” •请写一个程序,在尽量短的时间内,统计出“逆序对”的数目。•要求时间复杂度O(nlogn)  •解决思路:利用算法设计与分析 课程里有“分治”思想,类似合并排序 先看合并排序写程序时,发现自己不会写合并排序。牛X。对于合并排序的思想,自己认为很是熟悉,结果硬是花了一天时间才调出合并排

lvjianchao的专栏 2505

python 快排与并归排序

算法:解决问题的方法和步骤 评价算法的好坏:渐近时间复杂度(运行时间) 和渐近空间复杂度(运行次数)。 渐近时间复杂度的大O标记: - 常量时间复杂度 - 布隆过滤器 / 哈希存储 - 对数时间复杂度 - 折半查找(二分查找) - 线性时间复杂度 - 顺序查找 / 计数排序 - 对数线性时间复杂度 - 高级排序算法(归并排序、快速排序) - 平方时间复杂度 - 简单排序算法(选择排序、插入排序、冒泡排序) - 立方时间复杂度 - Floyd算法 / 矩阵乘法运算 - 几何级数时间..

weixin_42849517的博客 2万+

疯子的算法总结(六) 简单排序总 选择排序+插入排序+比较排序+冒泡排序

一、数组的排序算法 1.选择排序 选择排序是指每次选择所需排序数组中的最大值或者最小值(根据排序方式选择,从大到小选最大,从小到大选最小),将这个元素与前面没有进行排序的元素交换。 下面以1 4 2 5 9 6这些乱序元素,来表现排序过程。 第一次排序 9 4 2 5 1 6 第二次排序 9 6 2 5 1 4 第三次排序 9 6 5 2 1 4 第四次排序 9 6 5 4 1 2 第五次排序 ...

日拱一卒,功不唐捐 2823

函数传参简介,进程映像,局部变量、全局变量,类型限定符

目录 函数传参: 二分查找: 设计函数的准则: 进程映像: 程序:存储在磁盘上的可执行文件(二进制文件、脚本文件) 进程:正在系统中运行的程序 局部变量和全局变量 局部变量:定义在函数内 全局变量:定义在函数外 块变量:定义在语句块内的(if/for/while...) 类型限定符: auto extern static ...

LDS_Dante的博客 254

Java数组排序:比大小+冒泡排序+选择排序+插入排序

Java日报 部门:**大数据开发六部 姓名:cqmfx(阡陌飞絮) 日期:2020.10.25 备注:部分转自百度,优快云,菜鸟,侵权删 大纲 一、数组介绍 二、排序 数组那些事

cqmfx的博客——Java那些事 1279

leetcode 1122.数组的相对排序

leetcode 1122.数组的相对排序 题干 给你两个数组,arr1 和 arr2, arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 示例: 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19],

玛软的垃圾桶 129
上一篇: angular学习笔记--服务的三种定义方式
下一篇: css flexbox 学习笔记(一)
lavender21
博客等级 码龄11年 1粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值