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