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 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
执行结果如下,能够看到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 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简单排序的方法,能够实现对一维、二维矩阵的正序或倒序排列。
😜
😜😜
😜😜😜😜