fortran快速排序算法,示例对一维数组进行排序
- 0. 引言
- 1. 快速排序方法(QuickSqrt)代码实现
- 2. 结语
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 mainuse, intrinsic :: iso_fortran_envuse base_mathreal(real64),allocatable :: array(:),array2(:),array3(:)real(real64) :: t_beg,t_end,t_sampleinteger(int32) :: iallocate( array(12) ) ! 假定数组长度为12call random_seedcall random_number(array) ! 生成随机数组array2 = arraycall 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 nonecontains ! quickSort 算法
recursive subroutine QuickSort(Array)implicit nonereal(real64), intent(in out), dimension(:) :: Arrayinteger(int32) :: indexif(size(Array) <= 1) returncall Partition(Array, index)call QuickSort(Array(:index-1))call QuickSort(Array(index:))
end subroutine QuickSort! 分区过程
subroutine Partition(Array, marker)implicit nonereal(real64), intent(in out), dimension(:) ::Arrayinteger(int32), intent(out) :: markerinteger(int32) :: i, jreal(real64) :: tempreal(real64) :: pivot ! pivot pointpivot = Array(1)i= 0j= size(Array) + 1doj = j-1doif (Array(j) <= pivot) exitj = j-1end doi = i+1doif (Array(i) >= pivot) exiti = i+1end doif (i < j) thentemp = Array(i)Array(i) = Array(j)Array(j) = tempelseif (i == j) thenmarker = i+1returnelsemarker = ireturnendifend do
end subroutine Partitionend module base_math
2. 结语
本篇分享了基于fortran
快速排序的方法,能够实现对一维数组的排列。希望有所帮助
😜
😜😜
😜😜😜😜