arrays - 将数组从最低到最高 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
你们对另一种方法有任何想法吗?提前致谢。
解决方案
暂且不说这是否是对数组进行排序的好方法,让我们回答 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
请注意,这种方法完全避免了从数组中删除元素的概念上存在问题且在实践中缓慢的操作。是的,我本可以演示一个这样做的代码,但它会使已经很慢的方法变得更慢。
这是一个好的排序方法吗?不是特别多,但我在生产代码中看到过更糟的情况,对于短数组,它的糟糕性能不会被注意到。正是随着要排序的数组大小的增长,性能使得这对于通用排序例程来说是一个糟糕的选择。
这将我们带到了计算复杂性和一般排序问题,这几乎是计算机科学和软件工程中研究最多的问题。在这里,我同意解决更广泛问题的评论,例如什么是好的排序方法?使我们超出了这里可以接受的范围。
推荐阅读
- image - 拍摄视频快照时 Flutter 中的图像尺寸无效
- google-apps-script - 我试图一次运行 2 个函数,但似乎有问题
- vue.js - 当我单击 nuxt js 按钮时,会出现响应
- python - 在未过滤表中查找最旧(最小)日期以获取过滤表中的键值
- angular - 如何从 ag-grid angular 获取网格数据
- android - Android - 如何自动调整 TextView 的大小以适合固定高度的容器?
- powershell - 如何在 PowerShell 中获取应用程序的返回值?
- javascript - 检查 javascript 操作的数量以使其低于服务器端执行的限制
- javascript - 在这里变得不确定。有什么理由吗?
- php - 正确解析 curl_exec() json 响应