制作网络网站,偃师做网站,建行网站首页登录,深圳被点名批评fortran简单排序算法#xff0c;对一维、二维矩阵进行正序或倒序排序 0. 引言1. 算法实现1.1 一维数组排序1.2 二维数组排序1.2 module文件 2. 结语 0. 引言 排序算法是计算机科学中的一项重要技术#xff0c;它将一组数据按照特定的顺序排列起来。排序算法有很多种#xff… fortran简单排序算法对一维、二维矩阵进行正序或倒序排序 0. 引言1. 算法实现1.1 一维数组排序1.2 二维数组排序1.2 module文件 2. 结语 0. 引言 排序算法是计算机科学中的一项重要技术它将一组数据按照特定的顺序排列起来。排序算法有很多种如冒泡排序、选择排序、插入排序、快速排序等。排序算法在数据处理和计算机科学中具有重要的意义它能够帮助我们进行数据的组织和检索分析和统计去重和筛选提高程序的效率推动算法理论研究和算法工程的开发。 本篇基于Fortran内置函数minloc和maxlox对一维、二维矩阵进行可控的正序和倒序排列。
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执行结果如下能够看到array2和array3分别输入了正序排列和倒序排列的结果数据量少时可以适用数据量多的时候该方法比较耗时后续会有其他方法分享。 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),j1,size(array3,2))enddoprint *,二维数组array正序排列(排序后)do i 1, size(array2,1)write(*, ( *(f12.7,1X) ))(array2(i,j),j1,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简单排序的方法能够实现对一维、二维矩阵的正序或倒序排列。