因此,我进入职业生涯的第一年,就被困在一项作业中,我们需要读取一个数组,然后按从最低到最高的顺序对其进行排序,所以我的方法是创建另一个数组和星号给它第一个数组的最小值,然后继续。 我做的很少,我编写了代码,以便可以读取数组的值并将最低的值分配给称为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
你们对另一种方法有任何想法吗? 预先感谢。
答案 0 :(得分:2)
请稍等一下,这是否是对数组进行排序的好方法,让我们回答OP有关如何使所选方法起作用的紧迫问题。该答案使用内部例程minval
和minloc
。在这两种情况下,它都使用可选参数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
请注意,此方法完全避免了概念上有问题的操作,实际上避免了从数组中删除元素的操作缓慢。是的,我本来可以演示执行此操作的代码,但这会使本来就很慢的方法变得更慢。
这是一种很好的分类方法吗?并非特别如此,但我发现生产代码中的性能更差,对于短数组,它的性能不佳不会引起注意。而且,随着要排序的数组大小的增长,性能也变得不佳,因此对于通用排序例程而言,这是一个糟糕的选择。
这将我们带到计算复杂度和一般排序的问题,这恰恰是计算机科学和软件工程中研究最多的问题。在这里,我同意所提出的意见,即解决诸如什么是一种良好的排序方法?之类的更广泛的问题将使我们超越这里可以接受的范围。