主题:数据排序
wesky
[专家分:40] 发布于 2010-04-07 16:49:00
有如下几行数据(摘录一小部分)
22 46 412 458
41 9 395 439
42 20 367 178
42 20 2358 2318
42 37 400 330
42 37 853 415
44 12 897 436
44 12 977 1074
44 26 51 25
21 43 106 153
22 13 148 214
排序首先考虑每行第一个数,按从小到大排;要是头一个数相同,则考虑行的第二个数,也按小到大排;要是头两个数都相同,则考虑行的第三个数。excel里可以轻松做到,请问用fortran程序如何实现?谢谢。
回复列表 (共2个回复)
沙发
asymptotic [专家分:16630] 发布于 2010-04-07 20:21:00
那就用 Excel 排序好,再导出来; 解决问题的方法很多的,用你熟悉的方法。
板凳
elderQ [专家分:70] 发布于 2010-04-14 14:51:00
我写了一个小程序,可以解决你的问题。就是如果存在两行前三列以上都相同,就得继续添加if语句了,这个问题我还没有考虑好,其余的都可以解决了。
PROGRAM ORDER
!把待排序文件放在编译目录中,把该数据的行列数放在最前面/当然也可以手动输入
!例如:文件名:data.txt的4行4列的数据如下:
!4 4
!23 34 56 12
!12 45 17 89
!23 65 62 17
!34 45 56 67
INTEGER I,J,M,N,K
REAL R
INTEGER ,ALLOCATABLE :: A(:,:)
INTEGER ,ALLOCATABLE :: T(:)
OPEN(2010,FILE='data.txt',STATUS='OLD')
READ(2010,*) M,N
ALLOCATE(A(M,N),T(N))
READ(2010,*) A(1:M:1,1:N:1)
DO I=1,M-1
T=(/A(1:N:1,I)/)
DO K=I+1,M
J=1
IF(A(J,I).GT.A(J,K)) THEN
A(1:N:1,I)=(/A(1:N:1,K)/)
A(1:N:1,K)=T
ELSE IF(A(J,I).EQ.A(J,K)) THEN
J=J+1
IF(A(J,I).GT.A(J,I+1)) THEN
A(1:N:1,I)=(/A(1:N:1,K)/)
A(1:N:1,K)=T
ELSE IF(A(J,I).EQ.A(J,K)) THEN
J=J+1
IF(A(J,I).GT.A(J,I+1)) THEN
A(1:N:1,I)=(/A(1:N:1,K)/)
A(1:N:1,K)=T
END IF
END IF
END IF
END DO
END DO
DO I=1,N
WRITE(2010,'(4I4)') A(1:M:1,I)
END DO
END PROGRAM
我来回复