fortran快速排序算法,示例对一维数组进行排序

fortran快速排序算法,示例对一维数组进行排序


0. 引言

  快速排序(QuickSort)是一种常用的排序算法,采用分治策略实现。它的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分小。然后对这两部分数据分别进行递归排序,最后将两部分数据合并起来。

具体步骤如下

  1. 选择一个基准元素(pivot),通常选择数组的第一个元素。

  2. 将数组分成两部分,使得左边的元素都小于等于基准元素,右边的元素都大于等于基准元素。这个过程称为分区(partition)。

  3. 对左边的子数组和右边的子数组分别进行递归调用快速排序。

  4. 最后将左边的子数组、基准元素和右边的子数组合并起来。

  步骤2中的分区可以使用多种方式实现,其中一种常用的方式是通过两个指针(i和j)从数组的两端开始,i从左开始往右移动,j从右开始往左移动。当遇到左边的元素大于基准元素并且右边的元素小于基准元素时,交换这两个元素。不断移动指针直到i和j相遇,然后将基准元素和指针相遇位置的元素交换

  快速排序的时间复杂度为O(nlogn),其中n为数组的长度。最坏情况下的时间复杂度为O(n^2),发生在数组已经有序的情况下。为了避免最坏情况发生,可以选择随机选取基准元素。

  快速排序是一种原地排序算法,即不需要额外的辅助空间。

  本篇基于Fortran代码对上述流程进行实现,参考了网上的一些文章,下面是示例代码及主要过程实现。

1. 快速排序方法(QuickSqrt)代码实现

  下面是快速排序算法实现过程示例代码,主要算法在module文件中,示例实现了对一维数组的排序。

! 调用快速排序函数示例代码

program main
    use, intrinsic ::  iso_fortran_env
    use base_math
    real(real64),allocatable :: array(:),array2(:),array3(:)
    real(real64) :: t_beg,t_end,t_sample
    integer(int32) :: i
    
    allocate( array(12) ) ! 假定数组长度为12
    call random_seed
    call random_number(array) ! 生成随机数组
    
    array2 = array
     
    call cpu_time(t_beg)
    call QuickSort(array) !> 快速排序
    call cpu_time(t_end)
    
    t_quick = t_end - t_beg ! 计时
    print *,"    排序前  ","    排序后"
    do i = 1, size(array2)
        write(*, '(f12.7,1X,f12.7,1X,f12.7)')array2(i),array(i)
    enddo

   快速排序结果展示:


! module文件,存储快速排序的函数体

module base_math
use, intrinsic ::  iso_fortran_env
implicit none
    
contains  

! quickSort 算法
recursive subroutine QuickSort(Array)
 implicit none
 real(real64), intent(in out), dimension(:) :: Array
 integer(int32) :: index
 
 if(size(Array) <= 1) return
 call Partition(Array, index)
 call QuickSort(Array(:index-1))
 call QuickSort(Array(index:))
end subroutine QuickSort

! 分区过程
subroutine Partition(Array, marker)
 implicit none
 real(real64), intent(in out), dimension(:) ::Array
 integer(int32), intent(out) :: marker
 integer(int32) :: i, j
 real(real64) :: temp
 real(real64) :: pivot      ! pivot point
 
 pivot = Array(1)
 i= 0
 j= size(Array) + 1
 do
     j = j-1
     do
         if (Array(j) <= pivot) exit
         j = j-1
     end do
     i = i+1
     do
         if (Array(i) >= pivot) exit
         i = i+1
     end do
     if (i < j) then
         temp = Array(i)
         Array(i) = Array(j)
         Array(j) = temp
     elseif (i == j) then
         marker = i+1
         return
     else
         marker = i
         return
     endif
 end do
end subroutine Partition

end module base_math

2. 结语

   本篇分享了基于fortran快速排序的方法,能够实现对一维数组的排列。希望有所帮助






😜
😜😜
😜😜😜😜

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Fortran中,要将一个二维数组减去一个一维数组,你需要确保两个数组的维度和大小是兼容的。如果一维数组的大小与二维数组的某个维度大小相等,你可以通过在二维数组的每个元素上减去相应的一维数组元素来实现减法操作。 下面是一个示例代码,将一个二维数组减去一个一维数组: ```fortran program array_subtraction implicit none integer, parameter :: n = 3 ! 二维数组的大小 integer :: i, j integer :: two_d_array(n,n) ! 二维数组 integer :: one_d_array(n) ! 一维数组 ! 初始化二维数组 do i = 1, n do j = 1, n two_d_array(i, j) = i + j end do end do ! 初始化一维数组 do i = 1, n one_d_array(i) = i end do ! 输出原始的二维数组和一维数组 write(*,*) "原始的二维数组:" do i = 1, n write(*,*) two_d_array(i,:) end do write(*,*) write(*,*) "原始的一维数组:" write(*,*) one_d_array ! 将二维数组减去一维数组 do i = 1, n two_d_array(i,:) = two_d_array(i,:) - one_d_array end do write(*,*) ! 输出结果 write(*,*) "减去一维数组后的二维数组:" do i = 1, n write(*,*) two_d_array(i,:) end do end program array_subtraction ``` 在上面的示例代码中,我们首先初始化一个3x3的二维数组 `two_d_array` 和一个大小为3的一维数组 `one_d_array`。然后,我们将 `two_d_array` 的每一行减去 `one_d_array`,并将结果存储回 `two_d_array`。最后,我们输出结果。请注意,这种操作只在数组的维度和大小相匹配时才有效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咋(za)说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值