将数组从最低到最高排序 FORTRAN
Sorting an array from lowest to greatest FORTRAN
所以我在第一年的职业生涯中遇到了作业,我们需要读取一个数组,然后将其从低到高排序,所以我的方法是创建另一个数组然后用星标给它第一个数组的最小值并继续。
小我我做到了,我编写了一个代码,以便我可以读取数组的值并将最低值分配给一个名为 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
你们有其他方法可以做到这一点吗?
提前致谢。
暂且不管这是否是对数组进行排序的好方法,让我们来回答 OP 关于如何使所选方法起作用的直接问题。此答案使用内部例程 minval
和 minloc
。在这两种情况下,它都使用可选参数 mask
来控制考虑数组参数的哪些元素。有关函数及其参数的正确解释,请参阅您最喜欢的 Fortran 文档。
首先,声明掩码,一个大小和形状与vector
相同的逻辑数组
LOGICAL, DIMENSION(v_size) :: mk = .TRUE.
接下来,重复以下逻辑v_size
次:
- 找到
vector
中没有被屏蔽掉的最小元素;
- 将该元素复制到
v_ascendente
中的第 i
个位置;
- 屏蔽掉那个最小元素的位置,这样下次就不会考虑它了。
这导致
DO i = 1, v_size
v_ascendente(ix) = MINVAL(vector,mk)
mk(MINLOC(vector,mk)) = .FALSE.
END DO
请注意,此方法完全避免了概念上有问题且实际上很慢的从数组中删除元素的操作。是的,我本可以演示这样做的代码,但它会使本来就很慢的方法变得更慢。
这样的排序方法好吗?不是特别明显,但我在生产代码中看到过更糟糕的情况,对于短数组,它的糟糕性能不会被注意到。正是随着要排序的数组大小的增长,性能使得它成为通用排序例程的糟糕选择。
这将我们带到了计算复杂性和一般排序问题,这几乎是计算机科学和软件工程中研究最多的问题。在这里,我同意所发表的评论,即解决更广泛的问题,例如 什么是好的排序方法? 让我们远远超出了这里可以接受的范围。
所以我在第一年的职业生涯中遇到了作业,我们需要读取一个数组,然后将其从低到高排序,所以我的方法是创建另一个数组然后用星标给它第一个数组的最小值并继续。 小我我做到了,我编写了一个代码,以便我可以读取数组的值并将最低值分配给一个名为 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
你们有其他方法可以做到这一点吗? 提前致谢。
暂且不管这是否是对数组进行排序的好方法,让我们来回答 OP 关于如何使所选方法起作用的直接问题。此答案使用内部例程 minval
和 minloc
。在这两种情况下,它都使用可选参数 mask
来控制考虑数组参数的哪些元素。有关函数及其参数的正确解释,请参阅您最喜欢的 Fortran 文档。
首先,声明掩码,一个大小和形状与vector
LOGICAL, DIMENSION(v_size) :: mk = .TRUE.
接下来,重复以下逻辑v_size
次:
- 找到
vector
中没有被屏蔽掉的最小元素; - 将该元素复制到
v_ascendente
中的第i
个位置; - 屏蔽掉那个最小元素的位置,这样下次就不会考虑它了。
这导致
DO i = 1, v_size
v_ascendente(ix) = MINVAL(vector,mk)
mk(MINLOC(vector,mk)) = .FALSE.
END DO
请注意,此方法完全避免了概念上有问题且实际上很慢的从数组中删除元素的操作。是的,我本可以演示这样做的代码,但它会使本来就很慢的方法变得更慢。
这样的排序方法好吗?不是特别明显,但我在生产代码中看到过更糟糕的情况,对于短数组,它的糟糕性能不会被注意到。正是随着要排序的数组大小的增长,性能使得它成为通用排序例程的糟糕选择。
这将我们带到了计算复杂性和一般排序问题,这几乎是计算机科学和软件工程中研究最多的问题。在这里,我同意所发表的评论,即解决更广泛的问题,例如 什么是好的排序方法? 让我们远远超出了这里可以接受的范围。