- 积分
- 6918
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2013-1-1
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
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
|
|