不使用IF语句对一组数进行排序的分析和实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、不使用IF语句的两数排序方法
- 二、不使用IF的多数排序讨论
- 1、三数比较和排序
- 2、多个数据比较和排序
- 总结
前言
这个题目源于已经完成了不使用IF语句对两个数的比较大小,现在推广一下,能不能不使用IF语句完成一个普通的排序呢?本文就改题目进行一个尝试。
一、不使用IF语句的两数排序方法
我们使用伪代码或者C#进行编码,要求外代码支持所有主流语言的语法,但是不支持IF语句以及三目比较运算符。其实三目比较运算符也是一个变形的IF语句,这个本质上不符合我们的要求。
不使用IF语句的两数比较代码如下:
int[] x = new int[] { 100, 90};int [] rslt = new int[2] ;var big = x[(1 - Math.Sign(x[0] - x[1])) / 2];var small = x[(1 - Math.Sign(x[1] - x[0])) / 2];var result = string.Format("big = {0}, small = {1}", big,small);txt_resutl.Text = result;
上述方法将大数保存到big中,将小数保存到small中, 这样big 和small就构成一个有序序列,我们的问题是能否利用某种方法扩充这个有序序列,如果可以,那么排序就完成了。
二、不使用IF的多数排序讨论
1、三数比较和排序
不是一般性我们以整数为例进行数据的比较。
那么一个两数的有序序列表示如下
int[] ints = new int[] {1, 2,};
现在我们思考,如何将第三个数插入到这个数组中。
分析上面两数比较的过程,可知
1 - Math.Sign(x[0] - x[1])) / 2
表示的是大数数组元素的下标 另外一个是小数组元素的下标,这样得到链表排序的两数比较函数如下:
static public int[] Compare2Number(int[] n){int[] rsult = new int[2];//for (int i = 0; i < cn.Length; i++)//{// rsult[i] = cn[i];//}var n1 = n[0];var n2 = n[1];var idxA = (1 - Math.Sign(n1 - n2)) / 2;// the index of greater one var idxB = (1 - Math.Sign(n2 - n1)) / 2;// the index of the less onersult[0] = n[idxA];rsult[1] = n[idxB];return rsult;}
利用两数比较的函数,我们思考如何将第三个数放到这个有序队列 baseN 中。可以将第三个数与有序序列baseN 的第一个元素比较,生成一个新的有序序列 r1, 再将r1的第二个元素与baseN的第二个数进行比较,生成另一个有序序列r2。此时
r1[0], r2[0], r2[1] 就是三个元素的排序结果。
代码如下:
int[] baseN = new int[] { 1,2};int x3 = 3;var r0 = NoIFSort.Compare2Number(baseN);int[] x1 = new int[2];x1[0] = r0[0];x1[1] = x3;var r1 = NoIFSort.Compare2Number(x1);int[] x2 = new int[2];x2[0] = r1[1];x2[1] = r0[1];var r2 = NoIFSort.Compare2Number(x2);int[] rslt = new int[3];rslt[0] = r1[0];rslt[1] = r2[0];rslt[2] = r2[1];
上述代码将结果整合到一个新的序列中。
2、多个数据比较和排序
三数的比较是将第三个数与有序序列baseN 的第一个元素比较,得到一个2元序列,再将最后一个元素与有序序列的第二个元素比较,再得到一个2元序列,恻然生成一个三元有序序列。可以看出,将这个三元序列作为已知有序序列,就可以比较第四个数。这样推而广之,就可以进行能个数的比较。综上分析,可以写出一个数和n个数进行比较排序的代码:
static public int[] GetNewOrderSeq(int newX, int[] nSorted,int nSLen){int[] rsult = new int[nSLen+1];var x = newX;for(int i = 0; i < nSLen; i++){int[] cn = new int[2];cn[0] = x;cn[1] = nSorted[i];var new2Cn = Compare2Number(cn);rsult[i] = new2Cn[0];x=new2Cn[1];}rsult[nSLen] = x;return rsult;}
改函数的功能,将一个新数和已知有序序列进行比较,并且生成一个新的有序序列,nSLen 有序序列的长度。
在该函数的基础上,我们对需要排序的序列进行遍历,将元素从头到位一个一个地插到这个序列中,最终这个序列就是一个排好序的有序序列,从而实现对一组数的排序功能。
代码如下:
int[] ints = new int[] {1, 2, 4, 3, 5, };int[] nSorted = new int[ints.Length];nSorted[0]=ints[0];for (int i = 1; i < ints.Length; i++){var newX = ints[i];nSorted = NoIFSort.GetNewOrderSeq(newX, nSorted,i);}
上面代码使用两个数组,第一个数组保存需要排序的数据,第二个数组保存排序好的数据。
这样我们在不使用IF语句的限制下,完成了一个数组的排序。
PS: 上述代码在C#调试通过。
总结
不使用IF语句比较两个数的大小是本人在多年以前刚刚开始接触计算机的时候碰到的一个题目,当时使用Basic 实现。去年本人把数据结构又看了一遍深受里面名人大咖思想的影响和鼓舞,就一直想在算法上面做些实验。不使用IF语句进行排序也是最近才有的想法,隐约感觉是可以的。经过半天的探索终于实现,是记。
MaraSun BJFWDQ
相关文章:
不使用IF语句对一组数进行排序的分析和实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、不使用IF语句的两数排序方法二、不使用IF的多数排序讨论1、三数比较和排序2、多个数据比较和排序总结前言 这个题目源于已经完成了不使用IF语句对两个数的比…...
在大厂做了5年测试,3月被无情辞退,想给摸鱼的兄弟提个醒
先简单交代一下背景吧,某不知名 985 的本硕,17 年毕业加入字节,以“人员优化”的名义无情被裁员,之后跳槽到了有赞,一直从事软件测试的工作。之前没有实习经历,算是5年的工作经验吧。 这5年之间完成了一次…...
【职业规划】第二篇:程序员分级之中级程序员
Java程序员的分级并没有统一的标准,以下列举出来的只是我所理解的关于Java工程师的划分标准,不喜勿喷,如有建议,欢迎评论或私信。 二、Java中级程序员(又名:Java中级工程师/Java中级开发) 1.级别介绍与职责 简单一句话总结中级程序员就是:知道是什么。 具体些就是,…...
Studio One没有声音怎么办 Studio One工程没有声音
Studio One是一款非常优秀编曲软件,能够帮助用户高效的进行编曲和创作,也是目前主流的通道机架软件之一,受到很多音乐编曲爱好者的追捧。但是很多刚接触这款软件的小伙伴会碰到这样或者那样的问题,比如Stuidio one没有声音怎么办&…...
x86架构利用docker去编译arm64的应用程序
文章目录1. 交叉编译:toolchain2. 隔离挂载的方式:3. QEMU 或其他模拟器来实际运行dockerx86架构实现多平台系统代码的编译,实现方式有多种:交叉编译:toolchain 【新的第三方库不好处理】隔离挂载的方式 【速度慢&…...
华为OD机试题 - 优秀学员统计(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为…...
Nginx学习(7)—— 过滤模块(filter)
文章目录过滤模块简介执行时间和内容执行顺序Nginx是怎么按照次序依次来执行各个过滤模块的呢这些过滤模块的简述(按执行顺序)模块编译过滤模块分析相关结构体响应头过滤函数响应体过滤函数主要功能介绍发出子请求优化措施过滤模块简介 执行时间和内容 …...
【创作赢红包】
1、IoC\nIoC(Inversion of Control,控制反转)是一种软件设计思想,它的核心思想是将对象之间的依赖关系交给容器来管理,从而降低对象之间的耦合度,提高代码的灵活性和可维护性。\n\n在传统的编程模式中&…...
Mybatis入门
1. 框架 框架相当于是一个脚手架,内部已经写好了很多代码,我们只要其基础上进行开发就可以提高我们的开发效率 框架阶段学习: ①先去学习如何使用框架 ②然后再使用熟练的情况下去猜测内部的原理 ③通过源码去验证自己的猜测。 2.Mybat…...
金色传说:SAP-PP-CO01/CO02 生产订单下达保存时报错:用户状态 新建 是活动的 (ORD %00000000001) 消息号BS014
文章目录问题描述一、原因分析:二、解决方案:总结问题描述 某一特殊订单类型的生产订单下达保存时,出现报错提示:用户状态 新建 是活动的 (ORD %00000000001) 报错的消息号为BS014 一、原因分析: 既然是某一特殊订单类型才出现报错,那么问…...
@Transactional和synchronized同时使用时的一些问题以及解决
Transactional和synchronized同时使用并不能保证事务一致性背景任何事情都有一个发生背景有个需求【一个业务里面包含多个事务,而且还需要避免其他线程的影响,所幸的是该服务只需要启动单实例,不然还要考虑分布式的影响】我的思路就是用Transactional 和 synchronized来保证事务…...
贪心-根据身高重建队列
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 peopl…...
「解析」牛客网-华为机考企业真题 21-40
又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工…...
JAVA练习92-快乐数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 提示:这里可以添加本文要记录的大概内容: 3月28日练习内容 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目-…...
BPF 之路:技术背景
目录 引言 什么是BPF 历史 组成 执行机制 BPF 和ebpf 的关系 BCC、bpftrace、IO Visor BCC 项目的quick start execsnoop biolatency 动态插桩:kprobes和uprobes 概念 缺点 静态插桩:tracepoint 和USDT 概念 缺点 推荐的方案 初识bpft…...
C++—— set、map、multiset、multimap
目录 关联式容器 概念 键值对 树形关联式容器 set 介绍 定义方式 使用 map 介绍 使用 multiset 介绍 使用 multimap 介绍 使用 相关的OJ题 前K个高频单词 关联式容器 概念 我们之前接触过的一些容器,比如:vector、list、deque、forwa…...
Qlib使用
Qlib https://github.com/microsoft/qlib 将csv文件转化为Qlib的数据格式:https://qlib.readthedocs.io/en/latest/component/data.html#converting-csv-format-into-qlib-format 注意每支股票都要保存成单独一个文档,且文档名字与股票代号一致。 其中f…...
TL-WDR7660 httpProcDataSrv任意代码执行漏洞复现分析
01 漏洞简述 2023年1月31日,CNVD公开了一个由国内安全研究员提交的TL-WDR7660 httpProcDataSrv任意代码执行漏洞,编号为CNVD-2023-05404,同时公开了漏洞利用详情,poc代码链接为https://github.com/fishykz/TP-POC。从poc代码详情…...
基于DDS的SOA测试方案实现
随着以太网技术在车载网络中的应用,各种基于以太网的中间件也相继被应用在车内,如果对车载网络有过相关了解的小伙伴,对于作为中间件之一的DDS(数据分发服务Data Distribution Service)可能并不陌生;若没有…...
LibTorch中Windows系统环境配置及CUDA不可用问题解决
前言:本文对在Windows系统上进行LibTorch开发环境配置及相关问题解决做一个较为详细的记录,以便后续查询使用。 使用环境版本: Windows 11 Visual Studio 2022 CUDA 12.0 LibTorch 1.13.1_cu11.7 目录一、LibTorch简介二、LibTorch下载安装三…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...
