爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4970|回复: 8

[源代码] FORTRAN扣除重复值后排序

[复制链接]

新浪微博达人勋

发表于 2015-1-29 10:38:53 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 lysx 于 2015-1-29 10:59 编辑

最近需要用到排序的程序,以前我还手动编写过诸如冒泡法、希尔排序等程序,可是后来发现fortran 6.6中自带有SORTQQ的函数,直接就可以对原始序列进行升序排列,降序排列的话,直接将升序排列数组倒着输出就可以了!!!!!!!
但是现在需要用到扣除重复值的排序,比较头疼。我的做法是求最小值,求得最小值后,将其赋值给新数组的第一个值,然后将源数组中所有最小值赋值为缺省值。经验证,该法可行,缺点是较长序列,耗时较长!看看朋友们有什么好的办法,期待您的帮助!
下面贴上我的代码::
SUBROUTINE uniq_sort ( array, ndim, arr_sort, real_dim )
IMPLICIT NONE
INTEGER, INTENT ( IN ) :: ndim
REAL, INTENT ( IN ), DIMENSION ( ndim ) :: array
REAL, INTENT ( OUT ), DIMENSION ( ndim ) :: arr_sort ! be rearranged in descending order
INTEGER, INTENT ( OUT ) :: real_dim ! numbers of value without the repeated
INTEGER :: i
REAL :: value
REAL, DIMENSION ( ndim ) :: arr_org

arr_sort = undef; real_dim = 0; arr_org = array
DO i = 1, ndim
        value = MINVAL ( arr_org, arr_org .NE. undef )
        IF ( value .NE. undef ) THEN
                real_dim = real_dim + 1
                arr_sort ( real_dim ) = value
                WHERE ( arr_org .EQ. value )
                        arr_org = undef
                ENDWHERE
        ELSE
                EXIT
        END IF
END DO

real_dim = real_dim - COUNT ( arr_sort .EQ. 3.4028235E+38 )
WHERE ( arr_sort .EQ. 3.4028235E+38 )
        arr_sort = undef ! change the abnormal value 3.4028235E+38 to undef
ENDWHERE

END SUBROUTINE uniq_sort

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-29 10:55:27 | 显示全部楼层
你的文字描述里面“然后将源数组中所有最小值赋值为该最小值”应该是赋值为缺省值吧,至少我看程序是这么做的。
其实我觉得你这个方法也还可以,如果是我的话直接先排序,这样重复的值就相邻了。然后只要判断arr中i+1和i相等就去掉不等就保留。估计效率也差不多。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-29 11:01:03 | 显示全部楼层
lqouc 发表于 2015-1-29 10:55
你的文字描述里面“然后将源数组中所有最小值赋值为该最小值”应该是赋值为缺省值吧,至少我看程序是这么做 ...

谢谢您的答复!您的方法也值得借鉴!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-29 11:02:28 | 显示全部楼层
lqouc 发表于 2015-1-29 10:55
你的文字描述里面“然后将源数组中所有最小值赋值为该最小值”应该是赋值为缺省值吧,至少我看程序是这么做 ...

文字错误已修改!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2015-1-29 11:06:44 | 显示全部楼层
本帖最后由 言深深 于 2015-1-29 11:08 编辑

我一般喜欢自己写程序进行排序,冒泡法是最简单的。至于耗时,由于我是做气候的,时间序列一般都很短,并且现在的计算速度非常的快。
另外,由于只涉及到逻辑运算,所以速度是很快的。如果不是极客,窃以为,这种时间是可以忍受的。

然后,你说的剔除重复的是什么意思,是排序之前还是排序之后剔除?建议你排序之后剔除,这样排序之后,剔除的话,算法比较简单,只需要与前一个进行比较即可剔除。否则排序前,剔除,需要比较的数据就比较多。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-29 11:11:18 | 显示全部楼层
言深深 发表于 2015-1-29 11:06
我一般喜欢自己写程序进行排序,冒泡法是最简单的。至于耗时,由于我是做气候的,时间序列一般都很短,并且 ...

我是边排序边剔除的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-29 11:35:32 | 显示全部楼层
{:eb513:}{:eb513:}{:eb513:}{:eb513:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 成长值: 0
发表于 2015-1-29 12:13:55 | 显示全部楼层
lysx 发表于 2015-1-29 11:11
我是边排序边剔除的

这样混合操作的程序会比较复杂,而且,似乎运行效率没有先排序、再剔除高。原因就是比较相同数据的时候,已经排好的数据每一个都需要和考察的数据进行比较,这样速度自然就慢了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-29 14:32:54 | 显示全部楼层
言深深 发表于 2015-1-29 12:13
这样混合操作的程序会比较复杂,而且,似乎运行效率没有先排序、再剔除高。原因就是比较相同数据的时候, ...

明白!!!!!!!!!!!!!谢谢您的答复!
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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