回 帖 发 新 帖 刷新版面

主题:数据排序

有如下几行数据(摘录一小部分)
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个回复)

沙发

那就用 Excel 排序好,再导出来; 解决问题的方法很多的,用你熟悉的方法。

板凳

我写了一个小程序,可以解决你的问题。就是如果存在两行前三列以上都相同,就得继续添加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

我来回复

您尚未登录,请登录后再回复。点此登录或注册