Fortran Coder

查看: 1343|回复: 4
打印 上一主题 下一主题

[通用算法] 数据排序

[复制链接]

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

楼主
发表于 2023-6-20 10:02:11 | 显示全部楼层
你的意思是不是用数组ns保存排序的序号,我大概修改了一下
[Fortran] 纯文本查看 复制代码
! nline=116
DO i = 1, nline-1
  write(*,'(2i4)')i;
  ins=ns(1,i); ! 数组排序序号,原始序号在ns(2,i)中
   DO j = i+1, nline
      jns=ns(1,j); ! 序号
      IF ((ap(jns,1) < ap(ins,1)) .OR. &
         ((abs(ap(jns,1)-ap(ins,1))<1.0e-6) .AND. (ap(jns,2) < ap(ins,2))) .OR. &
         ((abs(ap(jns,1)-ap(ins,1))<1.0e-6) .AND. (abs(ap(jns,2)-ap(ins,2))<1.0e-6) .AND. (ap(jns,3) < ap(ins,3))) & ! TODO: 原来是<
         ) THEN
         write(*,*)'swap ',i,j
         ns(1,i) = jns
         ns(1,j)=ins
         ins=jns
         cycle;
      END IF
   END DO
END DO

OPEN (UNIT=4, FILE='resu.txt')
DO i = 1, nline
   WRITE (UNIT=4, FMT='(2i6,2x,10(f12.4,2x))') ns(1:2,i), ap(ns(1,i),1:3)
END DO

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

沙发
发表于 2023-6-20 15:06:12 | 显示全部楼层
Kieran 发表于 2023-6-20 11:55
非常感谢你的回复。

我的代码确实是在用ns变量保存各行在排序后的新序号。

1、我能大概明白你的代码的意思,但是排序那里和我思路不一样,我参考你的方式按自己的思路写的,结果就是你说的那样,从小到大排列。
2、cycle是直接进行下一次循环,不执行endif后面的语句节省点时间,这里因为endif后面没有语句了,所以不用也可以。
3、如果读入的lr是单位矩阵,那么你的代码ap(i,1:3)和ap(i,4:6)是相同的,我是这么测试查看输出结果的。
你的代码我没太明白,但是31行那个ap(i,1)<ap(j,1)应该是==。
我印象中浮点数比较用==的容易出问题,我用的绝对值差判断。
你的代码34~36行我不明白为什么要对ns循环赋值,我理解ns数组保存的序号,直接调换就行。
输出排序结果那段循环,就是43~47行,我不明白一共就116行你为什么要嵌套2次,直接循环116次输出就行。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-11 22:24

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表