パスワードを忘れた? アカウント作成
461542 journal

t-nissieの日記: 【電脳】Fortranで書いたクイックソート 3

日記 by t-nissie

探したら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に直しただけです。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by keepiru (34886) on 2008年08月24日 17時49分 (#1409068) 日記

    で、クイックソートを書くと頭がウニになります。(^O^)

    # 学生の頃やらされた人。

    • FORTRAN77だとgotoをたくさん使って書くのでしょうか。
      そものも再帰呼び出しができないかもしれません。
      『C言語による最新アルゴリズム事典』には再帰呼び出しを
      使わないクイックソートも載ってました。

      # 本文、typoとかちょっと修正しました。

      --
      love && peace && free_software
      t-nissie
      親コメント
      • by keepiru (34886) on 2008年08月26日 19時01分 (#1410232) 日記

        FORTRAN77だとgotoをたくさん使って書くのでしょうか。

        ですね。

        77 は再帰出来ないので。

        で、キモはインデックスをスタックに積んで処理するっつ~

        もっとも、スタックを使うって発想は後で気がついたものだから、すんげぇヤヤこしいプログラムを書いてたと云う...(^.^;;;)

        親コメント
typodupeerror

Stay hungry, Stay foolish. -- Steven Paul Jobs

読み込み中...