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






😜
😜😜
😜😜😜😜

相关推荐

  1. 排序算法——快速排序

    2024-07-13 04:36:04       56 阅读
  2. 排序算法——快速排序

    2024-07-13 04:36:04       61 阅读
  3. 排序算法-快速排序

    2024-07-13 04:36:04       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 04:36:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 04:36:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 04:36:04       57 阅读
  4. Python语言-面向对象

    2024-07-13 04:36:04       68 阅读

热门阅读

  1. 【C++精华铺】12.STL list模拟实现

    2024-07-13 04:36:04       18 阅读
  2. xargs命令

    2024-07-13 04:36:04       24 阅读
  3. TCP和UDP的区别

    2024-07-13 04:36:04       21 阅读