Quick Sort 방법에 의한 정렬

PROGRAM Main

IMPLICIT NONE

REAL, DIMENSION(:), ALLOCATABLE :: FailureTime
INTEGER :: NumTimes, I, OpenStatus, InputStatus
CHARACTER(20) :: FileName

WRITE (*, '(1X, A)', ADVANCE = "NO") "자료 파일 이름(20자 이내)을 입력하시오 : "
READ *, FileName

OPEN (UNIT = 15, FILE = FileName, STATUS = "OLD", IOSTAT = OpenStatus)

IF (OpenStatus > 0) THEN
STOP "*** 파일을 열 수 없음 ***"
END IF

NumTimes = 0

DO

READ (UNIT = 15, FMT = *, IOSTAT = InputStatus)

IF (InputStatus > 0) THEN
STOP "*** 입력 에러 ***" ! 프로그램 종료하기
END IF

IF (InputStatus < 0) THEN
EXIT ! DO 루프 빠져나가
END IF

! 파일에 들어 있는 데이터 세기
NumTimes = NumTimes + 1

END DO

REWIND(UNIT = 15)

ALLOCATE(FailureTime(NumTimes))

DO I = 1, NumTimes

READ (UNIT = 15, FMT = *, IOSTAT = InputStatus) FailureTime(I)

IF (InputStatus > 0) THEN
STOP "*** 입력 에러 ***" ! 프로그램 종료하기
END IF

IF (InputStatus < 0) THEN
EXIT ! DO 루프 빠져나가
END IF

END DO

CLOSE(15)

PRINT *, FailureTime

PRINT *, "Sorting ..."
PRINT *,

CALL QuickSort(FailureTime,1, NumTimes)

PRINT *, FailureTime

CONTAINS

RECURSIVE SUBROUTINE QuickSort(Item, First, Last)

REAL, DIMENSION(:), INTENT(INOUT) :: Item
INTEGER, INTENT(IN) :: First, Last
INTEGER :: Mid

IF (First < Last) THEN
Call Split(Item, First, Last, Mid)

Call QuickSort(Item, First, Mid - 1)
Call QuickSort(Item, Mid + 1, Last)
END IF
END SUBROUTINE QuickSort

SUBROUTINE Split(Item, Low, High, Mid)

REAL, DIMENSION(:), INTENT(INOUT) :: Item
INTEGER, INTENT(IN) :: Low, High
INTEGER, INTENT(OUT) :: Mid
INTEGER :: Left, Right
REAL :: Swap, Pivot

Left = Low
Right = High
Pivot = Item(Low)

DO
IF (Left >= Right) EXIT

DO
IF (Left >= Right .OR. Item(Right) < Pivot) EXIT
Right = Right - 1
END DO

DO
IF (Left >= Right .OR. Item(Left) > Pivot) EXIT
Left = Left + 1
END DO

IF (Left < Right) THEN
Swap = Item(Left)
Item(Left) = Item(Right)
Item(Right) = Swap
END IF

END DO

Item(Low) = Item(Right)
Item(Right) = Pivot
Mid = Right

END SUBROUTINE Split

END PROGRAM Main

위 소스를 08_06_QuickSort.f95로 저장

정렬할 자료

99.5
133.8
84.2
217.5
188.8
103.1
93.9
165.0
68.3
111.
88.8
88.2
90.1
70.2
150.5
122.9
138.8
99.9
111.6
155.7
133.4
122.2
93.4
101.5
109.9
103.3
177.7
188.1
99.8
144.4
87.5
79.3
190.2
190.3
170.1
160.9
121.1
95.6
140.5
177.2
150.1
140.3
139.2
113.8
155.9
144.4
88.3
83.5
101.1
112.8

위 자료를 08_01_Failure.dat로 저장

소스 컴파일 및 프로그램 테스트



'Programming > Fortran' 카테고리의 다른 글

다차원배열  (0) 2008.09.25
빈도구하기  (0) 2008.09.25
선택 정렬  (0) 2008.09.17
평균 이상의 고장 시간 출력(파일의 행수를 알아내기)  (0) 2008.09.17
배열 스왑(자동 할당 배열)  (1) 2008.09.17

+ Recent posts