hdiff output

r33375/fastutils.f90 2017-10-05 11:30:18.707243065 +0100 r33374/fastutils.f90 2017-10-05 11:30:18.983246696 +0100
3054: !  WRITE(*, 900) x(1), x(n), xmed3054: !  WRITE(*, 900) x(1), x(n), xmed
3055: !  900 FORMAT(' First & last = ', 2f10.4, '    Median = ', f10.4/)3055: !  900 FORMAT(' First & last = ', 2f10.4, '    Median = ', f10.4/)
3056: !  DEALLOCATE( x )3056: !  DEALLOCATE( x )
3057: !END DO3057: !END DO
3058: !3058: !
3059: !STOP3059: !STOP
3060: !END PROGRAM t_median3060: !END PROGRAM t_median
3061: 3061: 
3062: 3062: 
3063: 3063: 
3064: !SUBROUTINE median(x, n, xmed)3064: SUBROUTINE median(x, n, xmed)
3065: !3065: 
3066: !! Find the median of X(1), ... , X(N), using as much of the quicksort3066: ! Find the median of X(1), ... , X(N), using as much of the quicksort
3067: !! algorithm as is needed to isolate it.3067: ! algorithm as is needed to isolate it.
3068: !! N.B. On exit, the array X is partially ordered.3068: ! N.B. On exit, the array X is partially ordered.
3069: !3069: 
3070: !!     Latest revision - 26 November 19963070: !     Latest revision - 26 November 1996
3071: !IMPLICIT NONE3071: IMPLICIT NONE
3072: !3072: 
3073: !INTEGER, INTENT(IN)                :: n3073: INTEGER, INTENT(IN)                :: n
3074: !DOUBLE PRECISION, INTENT(IN OUT) :: x(n)3074: DOUBLE PRECISION, INTENT(IN OUT) :: x(n)
3075: !DOUBLE PRECISION, INTENT(OUT)                  :: xmed3075: DOUBLE PRECISION, INTENT(OUT)                  :: xmed
3076: !3076: 
3077: !! Local variables3077: ! Local variables
3078: !3078: 
3079: !DOUBLE PRECISION    :: temp, xhi, xlo, xmax, xmin3079: DOUBLE PRECISION    :: temp, xhi, xlo, xmax, xmin
3080: !LOGICAL :: odd3080: LOGICAL :: odd
3081: !INTEGER :: hi, lo, nby2, nby2p1, mid, i, j, k3081: INTEGER :: hi, lo, nby2, nby2p1, mid, i, j, k
3082: !3082: 
3083: !nby2 = n / 23083: nby2 = n / 2
3084: !nby2p1 = nby2 + 13084: nby2p1 = nby2 + 1
3085: !odd = .true.3085: odd = .true.
3086: !3086: 
3087: !3087: 
3088: !!     HI & LO are position limits encompassing the median.3088: !     HI & LO are position limits encompassing the median.
3089: !3089: 
3090: !IF (n == 2 * nby2) odd = .false.3090: IF (n == 2 * nby2) odd = .false.
3091: !lo = 13091: lo = 1
3092: !hi = n3092: hi = n
3093: !IF (n < 3) THEN3093: IF (n < 3) THEN
3094: !  IF (n < 1) THEN3094:   IF (n < 1) THEN
3095: !    xmed = 0.03095:     xmed = 0.0
3096: !    RETURN3096:     RETURN
3097: !  END IF3097:   END IF
3098: !  xmed = x(1)3098:   xmed = x(1)
3099: !  IF (n == 1) RETURN3099:   IF (n == 1) RETURN
3100: !  xmed = 0.5*(xmed + x(2))3100:   xmed = 0.5*(xmed + x(2))
3101: !  RETURN3101:   RETURN
3102: !END IF3102: END IF
3103: !3103: 
3104: !!     Find median of 1st, middle & last values.3104: !     Find median of 1st, middle & last values.
3105: !3105: 
3106: !10 mid = (lo + hi)/23106: 10 mid = (lo + hi)/2
3107: !xmed = x(mid)3107: xmed = x(mid)
3108: !xlo = x(lo)3108: xlo = x(lo)
3109: !xhi = x(hi)3109: xhi = x(hi)
3110: !IF (xhi < xlo) THEN          ! Swap xhi & xlo3110: IF (xhi < xlo) THEN          ! Swap xhi & xlo
3111: !  temp = xhi3111:   temp = xhi
3112: !  xhi = xlo3112:   xhi = xlo
3113: !  xlo = temp3113:   xlo = temp
3114: !END IF3114: END IF
3115: !IF (xmed > xhi) THEN3115: IF (xmed > xhi) THEN
3116: !  xmed = xhi3116:   xmed = xhi
3117: !ELSE IF (xmed < xlo) THEN3117: ELSE IF (xmed < xlo) THEN
3118: !  xmed = xlo3118:   xmed = xlo
3119: !END IF3119: END IF
3120: !3120: 
3121: !! The basic quicksort algorithm to move all values <= the sort key (XMED)3121: ! The basic quicksort algorithm to move all values <= the sort key (XMED)
3122: !! to the left-hand end, and all higher values to the other end.3122: ! to the left-hand end, and all higher values to the other end.
3123: !3123: 
3124: !i = lo3124: i = lo
3125: !j = hi3125: j = hi
3126: !50 DO3126: 50 DO
3127: !  IF (x(i) >= xmed) EXIT3127:   IF (x(i) >= xmed) EXIT
3128: !  i = i + 13128:   i = i + 1
3129: !END DO3129: END DO
3130: !DO3130: DO
3131: !  IF (x(j) <= xmed) EXIT3131:   IF (x(j) <= xmed) EXIT
3132: !  j = j - 13132:   j = j - 1
3133: !END DO3133: END DO
3134: !IF (i < j) THEN3134: IF (i < j) THEN
3135: !  temp = x(i)3135:   temp = x(i)
3136: !  x(i) = x(j)3136:   x(i) = x(j)
3137: !  x(j) = temp3137:   x(j) = temp
3138: !  i = i + 13138:   i = i + 1
3139: !  j = j - 13139:   j = j - 1
3140: !3140: 
3141: !!     Decide which half the median is in.3141: !     Decide which half the median is in.
3142: !3142: 
3143: !  IF (i <= j) GO TO 503143:   IF (i <= j) GO TO 50
3144: !END IF3144: END IF
3145: !3145: 
3146: !IF (.NOT. odd) THEN3146: IF (.NOT. odd) THEN
3147: !  IF (j == nby2 .AND. i == nby2p1) GO TO 1303147:   IF (j == nby2 .AND. i == nby2p1) GO TO 130
3148: !  IF (j < nby2) lo = i3148:   IF (j < nby2) lo = i
3149: !  IF (i > nby2p1) hi = j3149:   IF (i > nby2p1) hi = j
3150: !  IF (i /= j) GO TO 1003150:   IF (i /= j) GO TO 100
3151: !  IF (i == nby2) lo = nby23151:   IF (i == nby2) lo = nby2
3152: !  IF (j == nby2p1) hi = nby2p13152:   IF (j == nby2p1) hi = nby2p1
3153: !ELSE3153: ELSE
3154: !  IF (j < nby2p1) lo = i3154:   IF (j < nby2p1) lo = i
3155: !  IF (i > nby2p1) hi = j3155:   IF (i > nby2p1) hi = j
3156: !  IF (i /= j) GO TO 1003156:   IF (i /= j) GO TO 100
3157: !3157: 
3158: !! Test whether median has been isolated.3158: ! Test whether median has been isolated.
3159: !3159: 
3160: !  IF (i == nby2p1) RETURN3160:   IF (i == nby2p1) RETURN
3161: !END IF3161: END IF
3162: !100 IF (lo < hi - 1) GO TO 103162: 100 IF (lo < hi - 1) GO TO 10
3163: !3163: 
3164: !IF (.NOT. odd) THEN3164: IF (.NOT. odd) THEN
3165: !  xmed = 0.5*(x(nby2) + x(nby2p1))3165:   xmed = 0.5*(x(nby2) + x(nby2p1))
3166: !  RETURN3166:   RETURN
3167: !END IF3167: END IF
3168: !temp = x(lo)3168: temp = x(lo)
3169: !IF (temp > x(hi)) THEN3169: IF (temp > x(hi)) THEN
3170: !  x(lo) = x(hi)3170:   x(lo) = x(hi)
3171: !  x(hi) = temp3171:   x(hi) = temp
3172: !END IF3172: END IF
3173: !xmed = x(nby2p1)3173: xmed = x(nby2p1)
3174: !RETURN3174: RETURN
3175: !3175: 
3176: !! Special case, N even, J = N/2 & I = J + 1, so the median is3176: ! Special case, N even, J = N/2 & I = J + 1, so the median is
3177: !! between the two halves of the series.   Find max. of the first3177: ! between the two halves of the series.   Find max. of the first
3178: !! half & min. of the second half, then average.3178: ! half & min. of the second half, then average.
3179: !3179: 
3180: !130 xmax = x(1)3180: 130 xmax = x(1)
3181: !DO k = lo, j3181: DO k = lo, j
3182: !  xmax = MAX(xmax, x(k))3182:   xmax = MAX(xmax, x(k))
3183: !END DO3183: END DO
3184: !xmin = x(n)3184: xmin = x(n)
3185: !DO k = i, hi3185: DO k = i, hi
3186: !  xmin = MIN(xmin, x(k))3186:   xmin = MIN(xmin, x(k))
3187: !END DO3187: END DO
3188: !xmed = 0.5*(xmin + xmax)3188: xmed = 0.5*(xmin + xmax)
3189: !3189: 
3190: !RETURN3190: RETURN
3191: !END SUBROUTINE median3191: END SUBROUTINE median


legend
Lines Added 
Lines changed
 Lines Removed

hdiff - version: 2.1.0