首页 > 解决方案 > 将数组从最低到最高 FORTRAN 排序

问题描述

所以我在 Carrer 的第一年,我被困在一个任务中,我们需要读取一个数组,然后将它从最低到最高排序,所以我的方法是创建另一个数组并给它加星号第一个数组的最小值并继续。小我我做到了,我编写了一个代码,以便我可以读取数组的值并将最小值分配给一个名为 minimo 的单独值。但是我被困在那里,我可以将最低值分配给我的新排序数组的第一个值,但是当再次检查最低值时,它当然会告诉我相同的数字,所以我想也许在给我之后最低值我可以从原始数组中删除它并再次检查最低值,但我真的不知道从哪里开始,或者即使这是最佳方法,甚至是可能的方法。

PROGRAM hello
IMPLICIT NONE
integer, dimension(1000) :: vector, v_ascendente, v_descendente
integer :: v_size, i, j, minimo = 1000000

print*, "Cuantos numeros introducira"
read*, v_size
print*, "Introduzca los", v_size, "numeros del vector separandolos por ENTER"

do i=1, v_size
    read*, vector(i)
end do

do j=1, v_size
    do i=1, v_size
        minimo = min(minimo, vector(i))
    end do
    print*, "minimo = ", minimo
    v_ascendente(j) = minimo
end do
END PROGRAM

你们对另一种方法有任何想法吗?提前致谢。

标签: arrayssortingfortranfortran90

解决方案


暂且不说这是否是对数组进行排序的好方法,让我们回答 OP 关于如何使所选方法起作用的直接问题。此答案使用内部例程minvalminloc. 在这两种情况下,它都使用可选参数mask来控制数组参数的哪些元素被考虑。有关函数及其参数的正确解释,请参阅您最喜欢的 Fortran 文档。

首先,声明掩码,一个大小和形状相同的逻辑数组vector

  LOGICAL, DIMENSION(v_size) :: mk = .TRUE.

接下来,重复以下逻辑v_size时间:

  • 找到vector未被屏蔽的最小元素;
  • 将该元素复制到;中的i第 - 个位置v_ascendente
  • 屏蔽那个最小元素的位置,以便下次不考虑它。

这导致

DO i = 1, v_size
   v_ascendente(ix) = MINVAL(vector,mk)
   mk(MINLOC(vector,mk)) = .FALSE.
END DO

请注意,这种方法完全避免了从数组中删除元素的概念上存在问题且在实践中缓慢的操作。是的,我本可以演示一个这样做的代码,但它会使已经很慢的方法变得更慢。

这是一个好的排序方法吗?不是特别多,但我在生产代码中看到过更糟的情况,对于短数组,它的糟糕性能不会被注意到。正是随着要排序的数组大小的增长,性能使得这对于通用排序例程来说是一个糟糕的选择。

这将我们带到了计算复杂性和一般排序问题,这几乎是计算机科学和软件工程中研究最多的问题。在这里,我同意解决更广泛问题的评论,例如什么是好的排序方法?使我们超出了这里可以接受的范围。


推荐阅读