t-nissieの日記: 【電脳】Fortranで書いたクイックソート 3
探したら3年前にFortranで書いたクイックソートが出てきた。
比較のための関数を引数にできないし、さいきんのFortranは
ポリモーフィズ厶とかもできるらしいからどんな配列でも
ソートできるようなコードも書けるんだろうけど。
ほんとqsort(3)の汎用性はよくできていると思う。
! quicksort.f -*-f90-*-
! Author: t-nissie
!!
recursive subroutine quicksort(a, first, last)
implicit none
real*8 a(*)
integer first, last
integer i, j
real*8 x, t
x = a( (first+last) / 2 )
i = first
j = last
do
do while (a(i) < x)
i=i+1
end do
do while (x < a(j))
j=j-1
end do
if (i >= j) exit
t = a(i); a(i) = a(j); a(j) = t
i=i+1
j=j-1
end do
if (first < i - 1) call quicksort(a, first, i - 1)
if (j + 1 < last) call quicksort(a, j + 1, last)
end subroutine quicksort
! sortreal8.f -*-f90-*-
! Author: t-nissie
!!
program sortreal8
implicit none
real*8 a(10)
a( 1) = 1.0d0
a( 2) = 1.0d0
a( 3) = 5.0d0
a( 4) = 3.0d0
a( 5) = -1.0d0
a( 6) = 11.0d0
a( 7) = 1.0d1
a( 8) = 31.0d0
a( 9) = -5.0d0
a(10) = 1.1d0
call quicksort(a,1,10)
write(6,'(f10.5)') a
end program sortreal8
コンパイルと実行:
$ gfortran -ffree-form -o sortreal8 sortreal8.f quicksort.f
$ ./sortreal8
奥村晴彦著『C言語による最新アルゴリズム事典』のCのコードを
Fortranに直しただけです。
FORTRAN 77 (スコア:1)
で、クイックソートを書くと頭がウニになります。(^O^)
# 学生の頃やらされた人。
Re:FORTRAN 77 (スコア:1)
そものも再帰呼び出しができないかもしれません。
『C言語による最新アルゴリズム事典』には再帰呼び出しを
使わないクイックソートも載ってました。
# 本文、typoとかちょっと修正しました。
love && peace && free_software
t-nissie
Re:FORTRAN 77 (スコア:1)
ですね。
77 は再帰出来ないので。
で、キモはインデックスをスタックに積んで処理するっつ~
もっとも、スタックを使うって発想は後で気がついたものだから、すんげぇヤヤこしいプログラムを書いてたと云う...(^.^;;;)