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快速排序的方法,能够实现对一维数组的排列。希望有所帮助






😜
😜😜
😜😜😜😜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咋(za)说

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

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

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

打赏作者

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

抵扣说明:

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

余额充值