fortran简单排序算法,对一维、二维矩阵进行正序或倒序排序

news2024/11/14 13:53:21

fortran简单排序算法,对一维、二维矩阵进行正序或倒序排序

  • 0. 引言
  • 1. 算法实现
    • 1.1 一维数组排序
    • 1.2 二维数组排序
    • 1.2 module文件
  • 2. 结语


0. 引言

   排序算法是计算机科学中的一项重要技术,它将一组数据按照特定的顺序排列起来。排序算法有很多种,如冒泡排序、选择排序、插入排序、快速排序等。排序算法在数据处理和计算机科学中具有重要的意义,它能够帮助我们进行数据的组织和检索,分析和统计,去重和筛选,高程序的效率,推动算法理论研究和算法工程的开发。

   本篇基于Fortran内置minlocmaxlox一维、二维矩阵进行可控的正序和倒序排列。

1. 算法实现

1.1 一维数组排序

   示例1 生成一个随机一维向量,调用module文件下的sort_simple函数进行正序和倒序排列,sort_simple函数的一般形式为:

function sort_simple(array, bool)result(array2)

其中array为待排序的一维向量;bool可选参数,默认正序排列,设置为True时倒序排列;array2为返回排序后的结果,size和array的size一致。

! Main文件 简单一维排序
program main
    use, intrinsic ::  iso_fortran_env
    use base_math
    
    !> 三种排序比较 调用简单排序
    real(real64),allocatable :: array(:),array2(:),array3(:)
    integer :: i
    real(real64) :: t_beg,t_end,t_sample
    real(real64),allocatable,dimension(:) :: arr
    
    allocate( array(12) ) ! 假定数组长度为12
    call random_seed
    call random_number(array) ! 生成随机数组
    
    call cpu_time(t_beg)
    array2 = sort_simple(array) 
    array3 = sort_simple(array, .true.)
    call cpu_time(t_end)
    t_sample = t_end - t_beg ! 记录用时
    
    do i = 1, size(array2)
        write(*, '(f12.7,1X,f12.7,1X,f12.7)')array2(i),array3(i)
    enddo
end program

   执行结果如下,能够看到array2array3分别输入了正序排列倒序排列的结果,数据量少时可以适用,数据量多的时候该方法比较耗时,后续会有其他方法分享。


1.2 二维数组排序

   示例2 生成一个随机二维向量,调用module文件下sort_simple_dim2函数进行正序和倒序排列,sort_simple_dim2函数的一般形式为:

function sort_simple_dim2( array, dim, bool)result(array2)

   其中array为输入要排序的二维矩阵,dim控制对行或列进行排序,1为行,2为列;bool可选参数,默认正序排列,设置为True时倒序排列。

! Main文件 简单二维排序
program main
    use, intrinsic ::  iso_fortran_env
    use base_math
    real(real64),allocatable :: array(:,:),array2(:,:),array3(:,:)
    integer(int32) :: i,j
    
    allocate(array(4,4))
    call random_seed
    call random_number(array) ! 生成随机数组
    
    array2 = sort_simple_dim2( array, 1)
    array3 = sort_simple_dim2( array, 1,.true.)
    
    print *,"二维数组array倒序排列(排序前):"
    do i = 1, size(array3,1)
        write(*, '( *(f12.7,1X) )')(array3(i,j),j=1,size(array3,2))
    enddo
    
    print *,"二维数组array正序排列(排序后):"
    do i = 1, size(array2,1)
        write(*, '( *(f12.7,1X) )')(array2(i,j),j=1,size(array2,2))
    enddo
    
end 

1.2 module文件

   module文件 中内容如下,包含了两个用于排序的函数体:

! module文件
module base_math
use, intrinsic ::  iso_fortran_env
implicit none
    
contains    
    
!** 排序(一维简单排序)     
function sort_simple(array, bool)result(array2)
implicit none
real(real64)  ::   array(:)
logical,optional :: bool
integer(int32) :: count,i,cont
integer(int32) :: index(1)
real(real64)    ,allocatable  :: array2(:),array3(:)
logical :: bool2
real(real64) :: num1,num2
real(real64),parameter :: hg = huge (0.d0)
real(real64),parameter :: eps = epsilon(0.d0)

bool2 = .false.
if(present(bool))bool2 = bool ! 控制倒序还是正序(默认是正序)

count = size(array)
if(count == 1)return
array3 = array
allocate(array2, source = array)
cont = 0
do
    cont = cont + 1
    if(.not. bool2)then
        index = minloc(array3)
        array2(cont) = array3(index(1))
        array3(index) = hg
    else
        index = maxloc(array3)
        array2(cont) = array3(index(1))
        array3(index) = eps
    endif
    if(cont == count)exit
enddo

end function
    
! 二维矩阵按行排序/按列排序(将每一行或列按一定的次序排列)
function sort_simple_dim2( array, dim, bool)result(array2)
real(real64),allocatable,intent(in) :: array(:,:)
integer(int32),intent(in) :: dim
logical,optional :: bool
real(real64),allocatable :: array2(:,:)
real(real64),allocatable :: array3(:,:)
integer(int32) :: i
logical :: bool2

if( .not.allocated(array) )return
if(size(array,1) == 1 .and. size(array,2) == 1)return


bool2 = .false.
if(present(bool))bool2 = bool ! 控制倒序还是正序(默认是正序)
array3 = array


allocate(array2,source = array)
if(dim == 1)then ! 逐行排序
    do i = 1, size(array,1)
        array2(i,:) = sort_simple(array(i,:), bool2)
    enddo
    
elseif(dim == 2)then ! 逐列进行排序
    do i = 1, size(array,2)
        array2(:,i) = sort_simple(array(:,i), bool2)
    enddo    
endif

end function

end module base_math


2. 结语

   本篇分享了基于fortran简单排序的方法,能够实现对一维、二维矩阵的正序或倒序排列。






😜
😜😜
😜😜😜😜

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1925713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生】Prometheus整合Alertmanager告警规则使用详解

目录 一、前言 二、Altermanager概述 2.1 什么是Altermanager 2.2 Altermanager使用场景 三、Altermanager架构与原理 3.1 Altermanager使用步骤 3.2 Altermanager工作机制 3.3 Altermanager在Prometheus中的位置 四、Altermanager部署与接入Prometheus 4.1 Altermana…

Codeforces Round 797 (Div. 3) F. Shifting String

感觉这种题写多了,第一眼就感觉是个图论,很经典的排列置换问题,首先连边,然后观察样例可以知道,大概是多个环的大小取lcm,但容易发现,环内部的循环节也对答案有影响,比如一个长度为4…

threadx 线程以及优先级调整案例

以正点原子stm32 f407板子为例子,如何创建工程 CubeMXCubeIDE在我之前的文章里提到了,这里我就不多重复。 有关线程优先级的两个参数 priority和preemption,我们来看看在官网是如何定义的 在main.c里面添加一个printf转串口的代码&#xff0…

Binder解析精炼

Binder原理解析精炼 1 注册服务 Server进程向binder驱动向Binder驱动发起服务注册请求 向Binder驱动申请创建一个XXXService的Binder的实体,Binder驱动为这个XXXService创建位于内核中的Binder实体节点以及Binder的引用 Binder驱动将注册请求转发给ServiceManager进…

Manim学习笔记05:实现向量的加法动画

以同一点 O𝑂 为起点的两个已知向量 →a𝑎→, →b𝑏→,以 OA𝑂𝐴,OB𝑂𝐵 为邻边作 □OACB◻𝑂𝐴𝐶𝐵&#xff…

Yolov8 姿态估计

原文:Yolov8 姿态估计 - 知乎 (zhihu.com) YOLOv8论文还没有,官方默默又加了新模型:姿态估计。 现在你可以用YOLOv8做目标检测、实例分割、图像分类、目标跟踪、姿态估计,未完待续。。。。。。 一、Yolov8姿态估计 Yolov8的姿态估计模型是在COCO数据集训练的,目前支持…

python+Selenium自动化之免登录(cookie及token)

目录 cookie免登录 通过接口获取cookie 启用浏览器绕过登录 添加token 使用登录可以减去每次登录的重复操作,直接操作系统登录后的菜单页面,也可以减少安全验证登录,如图像验证登录的操作。注意:cookie和token都有有效期。 c…

前端Vue组件化实践:打造自定义等宽tabs标签组件

在前端开发的世界里,随着业务复杂度的提升和需求的多样化,传统的整体式开发方式已经难以满足快速迭代和高效维护的需求。组件化开发作为一种重要的解决方案,正逐渐受到广大开发者的青睐。本文将结合Vue框架,探讨如何通过组件化开发…

如何在Linux上如何配置虚拟主机

在Linux上配置虚拟主机可以通过使用Apache HTTP服务器来实现。Apache是一个开源的跨平台的Web服务器软件,可以在多种操作系统上运行并支持虚拟主机的配置。 以下是在Linux上配置虚拟主机的步骤: 安装Apache HTTP服务器 在终端中运行以下命令来安装Apache…

CANoe:为什么两个VLAN接口不能设置同一个网络的IP地址呢?

经常玩CANoe的人应该配置过TCP/IP Stack中网络节点的网卡信息,基本的信息包含:MAC地址、IP地址、子网掩码、默认网关、MTU值、IPv6地址。 如果你想让发送出去的报文携带VLAN tag,可以在网卡上添加VLAN tag信息。 此时你就能得到两个新的网卡V…

加速数字化转型,信创自主可控:TapData 为银行业数据管理能力建设提供新思路

使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量代替 OGG、DSG 等同步工具,「CDC 流处理 数据集成」组合拳,加速仓内数据流转,帮助企业将真正具有业务价值的数据作用到实处,…

防火墙nat与智能选路

这里写目录标题 此实验是基于上个实验的基础上添加功能拓扑1办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换)首先在fw1防火墙创建电信和移动两个安全区域,并且将对应的接口划分进去配置nat测试 分公司设备可…

Java核心篇之JVM探秘:内存模型与管理初探

系列文章目录 第一章 Java核心篇之JVM探秘:内存模型与管理初探 第二章 Java核心篇之JVM探秘:对象创建与内存分配机制 第三章 Java核心篇之JVM探秘:垃圾回收算法与垃圾收集器 第四章 Java核心篇之JVM调优实战:Arthas工具使用及…

[web]-sql注入-白云搜索引擎

ctrlu查看源代码&#xff0c;发现前端有js过滤 <script>function myFunction(){var xdocument.getElementById("number").value;var adocument.getElementById("word").value;var ba.replace(/[\ |\~|\|\!|\|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\|\…

linux之find指令基础

目录 前言一、find .二、find xxx -name "*.c"三、组合查找文件名四、find . -type f五、find . -maxdepth 2 -type f六、find . -type f -perm 777七、find . -type f -name "*.txt" ! -perm 777八、借助-exec命令参考链接 前言 testfind下 check1.c ch…

【HTML入门】第十二课 - iframe框架

在早期没有出现Vue和React之前呢&#xff0c;做管理系统&#xff0c;iframe是非常普遍的技术。比如管理系统左侧有非常多的菜单&#xff0c;然后点击菜单后&#xff0c;右边就要展现不同的页面。 又或者呢&#xff0c;我们看一些网站&#xff0c;他们侧边展示着五彩绚烂的广告&…

在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位一、数据实时监控的重要性二、PostgreSQ…

MySQL学习记录 —— 이십 常用工具包

文章目录 1、总览2、mysqlcheck - 表维护程序1、作用2、注意事项3、语法4、命令选项下面每块都大致有这四个部分 3、Mysqldump - 数据库备份程序4、mysqladmin - MySQL 服务器管理程序5、mysqlshow - 显示数据库、表和列信息6、mysqldumpslow - 总结慢查询日志文件7、mysqlbinl…

福利:领取生育津贴汇总

大家注意了&#xff0c;最近多地区发文&#xff0c;生育津贴有了新变化。为了国家的未来&#xff0c;各位大佬记得全力以赴三胎。 01北京--不用缴费也能领取生育津贴 7月1日&#xff0c;北京市人社局、医保局、财政局、税务局等多部门联合印发了《关于领取失业保险金人员参加生…

【并发编程】进程 线程 协程

进程&#xff08;Process&#xff09;、线程&#xff08;Thread&#xff09;和协程&#xff08;Coroutine&#xff09;构成了计算机科学中实现任务并发执行的三种核心抽象机制。通常&#xff0c;为了提高程序的执行效率&#xff0c;开发者会根据应用场景和性能需求&#xff0c;…