当前位置: 首页 > news >正文

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

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 mainuse, intrinsic ::  iso_fortran_envuse base_math!> 三种排序比较 调用简单排序real(real64),allocatable :: array(:),array2(:),array3(:)integer :: ireal(real64) :: t_beg,t_end,t_samplereal(real64),allocatable,dimension(:) :: arrallocate( array(12) ) ! 假定数组长度为12call random_seedcall 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 mainuse, intrinsic ::  iso_fortran_envuse base_mathreal(real64),allocatable :: array(:,:),array2(:,:),array3(:,:)integer(int32) :: i,jallocate(array(4,4))call random_seedcall 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))enddoprint *,"二维数组array正序排列(排序后):"do i = 1, size(array2,1)write(*, '( *(f12.7,1X) )')(array2(i,j),j=1,size(array2,2))enddoend 

1.2 module文件

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

! module文件
module base_math
use, intrinsic ::  iso_fortran_env
implicit nonecontains    !** 排序(一维简单排序)     
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
docont = cont + 1if(.not. bool2)thenindex = minloc(array3)array2(cont) = array3(index(1))array3(index) = hgelseindex = maxloc(array3)array2(cont) = array3(index(1))array3(index) = epsendifif(cont == count)exit
enddoend 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 :: bool2if( .not.allocated(array) )return
if(size(array,1) == 1 .and. size(array,2) == 1)returnbool2 = .false.
if(present(bool))bool2 = bool ! 控制倒序还是正序(默认是正序)
array3 = arrayallocate(array2,source = array)
if(dim == 1)then ! 逐行排序do i = 1, size(array,1)array2(i,:) = sort_simple(array(i,:), bool2)enddoelseif(dim == 2)then ! 逐列进行排序do i = 1, size(array,2)array2(:,i) = sort_simple(array(:,i), bool2)enddo    
endifend functionend module base_math

2. 结语

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






😜
😜😜
😜😜😜😜

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【深度学习】PyTorch深度学习笔记02-线性模型
  • 百度安全大模型智能体实践入选信通院“安全守卫者计划”优秀案例
  • 专业条码二维码扫描设备和手机二维码扫描软件的区别?
  • 【Java--数据结构】栈:不仅仅是数据存储,它是编程的艺术
  • Docker 容器出现 IP 冲突
  • 深度加速器 为游戏而生
  • 【ARM】CCI缓存一致性整理
  • [论文笔记]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL
  • 【LeetCode】2187. 完成旅途的最少时间
  • 基于Python/MATLAB长时间序列遥感数据处理及在全球变化、植被物候提取、植被变绿与生态系统固碳分析、生物量估算与趋势分析应用
  • Three.js相机简明教程
  • 期货量化交易客户端开源教学第三节——键盘通信协议
  • CSS相对定位和绝对定位的区别
  • 了解Maven
  • stm32中断详解
  • Invalidate和postInvalidate的区别
  • Lsb图片隐写
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Python - 闭包Closure
  • springMvc学习笔记(2)
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 阿里云前端周刊 - 第 26 期
  • 从setTimeout-setInterval看JS线程
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 记一次删除Git记录中的大文件的过程
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 数据科学 第 3 章 11 字符串处理
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 怎么将电脑中的声音录制成WAV格式
  • 怎样选择前端框架
  • 1.Ext JS 建立web开发工程
  • ​ArcGIS Pro 如何批量删除字段
  • ​决定德拉瓦州地区版图的关键历史事件
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $.proxy和$.extend
  • (6)STL算法之转换
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C++17) optional的使用
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (二)WCF的Binding模型
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)Dubbo快速入门、介绍、使用
  • (转)Unity3DUnity3D在android下调试
  • (转)Windows2003安全设置/维护
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET企业级应用架构设计系列之开场白