【问题标题】:Sorting an array from lowest to greatest FORTRAN [closed]将数组从最低到最高排序 FORTRAN [关闭]
【发布时间】:2019-05-29 01:00:37
【问题描述】:

所以我在 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

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

【问题讨论】:

  • 我投票结束这个过于宽泛:有很多众所周知的排序算法,我们无法在这里介绍。如果您正在尝试实现特定的一个并且卡住了,那么请在那里重点修改问题。当然,如果你真的想用这种当前的方法做点什么,那么最好去掉“最佳方式”部分。
  • 关于如何从数组中删除特定元素的问题,有like this onethis one 涉及到的问题。如果这确实是您的问题,那么您也许可以改写为“排序”问题?
  • 您的代码需要 O(n^2) 时间复杂度。这不是最优的。请阅读有关合并排序、堆排序甚至快速排序的信息。如果您想要更快速的方法并且您的数组值不是太多。您可以使用计数排序,所有这些都比您的算法更好。
  • 许多著名的算法都有免费的 Fortran 实现,例如,rosettacode.org/wiki/Sorting_algorithms/Shell_sort#Fortranrosettacode.org/wiki/Category:Sorting_Algorithms 中选择任何其他@
  • 我认为这个问题对新贡献者来说有点苛刻。虽然最后一个问题你们对另一种方法有什么想法吗?确实相当广泛,但制作符合 OP 大纲设计的工作代码为 Fortran 初学者提供了一些宝贵的经验教训。而且,Backus 知道,对于 Fortran 主题的定期贡献者很少,我们或许应该不愿意吓跑新的。

标签: arrays sorting fortran fortran90


【解决方案1】:

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

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

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

接下来,重复以下逻辑v_size次:

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

导致

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

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

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

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

【讨论】: