Bootstrap

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

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


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简单排序的方法,能够实现对一维、二维矩阵的正序或倒序排列。






😜
😜😜
😜😜😜😜

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;