PROGRAM Medyan_Hesabi
!-----------------------------------------------------
! 10prg02.f95
! Dinamik dizi ile N tane sayının medyanı.
!
! Median(3,4,4,5,6,8,8,8,10)  = 6.0
! Median(5,5,7,9,11,12,15,18) = (9+11)/2.0 = 10.0
!-----------------------------------------------------
IMPLICIT NONE
INTEGER, ALLOCATABLE :: A(:)
INTEGER  :: N, Durum

 PRINT *,"Eleman sayısı (N)?"
 READ *,N

 ALLOCATE(A(N),STAT=Durum)

 IF(Durum /=0 ) STOP "Yetersiz bellek alanı."

 PRINT *,N , " tane sayı girin:"
 READ *,A

 PRINT *,"Bu kümenin medyanı ",Median(A)

 DEALLOCATE(A)

CONTAINS
  
  REAL FUNCTION Median(A)
  !---------------------------------------------------
  ! A dizisinin medyanını hesaplar.
  !---------------------------------------------------
  INTEGER, INTENT(INOUT) :: A(:)
  INTEGER :: K,J,N,Gec

   ! Dizinin boyutu
     N = SIZE(A)

   ! Kabarcık sıralama ile küme elemanları 
   ! küçükten büyüğe doğru sıralanıyor
     DO K=1,N
     DO J=1,N-1
        IF(A(J) < A(J+1)) THEN
            Gec = A(J)
            A(J) = A(J+1)
          A(J+1) = Gec
        END IF
     END DO
     END DO

   ! Medyanı hesapla
     IF(MOD(N,2)==1) THEN  ! tek sayılı
       Median = A((N+1)/2)
     ELSE                  ! çift sayılı elemanlar
       Median = (A(N/2)+A(N/2+1))/2.0
     END IF

  END FUNCTION Median

END PROGRAM Medyan_Hesabi