回 帖 发 新 帖 刷新版面

主题:将彭国伦快速排列的程序改为实数组后 运行后排列顺序不对

代码如下 也可见附件,观测结果中得数据 18.05000       19.55000       19.15000排序不对呀       
program main
real A(78)

OPEN(11,FILE='result.txt')
OPEN(12,FILE='result1.txt')
read (11,*)(A(I),I=1,78)
DO  I=1,77
    DO K=1,78
    if(A(I)==A(K).and.(K/=I))write(*,*)I,A(K)
    ENDDO
ENDDO
call Quick_Sort(A,78,1,78)
write (12,*)(A(I),I=1,78)
pause
endprogram


recursive subroutine Quick_Sort(A,N,S,E)
implicit none
  integer :: N    ! 表示类型的大小
  real :: A(N) ! 存放数据的类型
  integer :: S    ! 传入的参数, 这一组的类型起始位置
  integer :: E    ! 传入的参数, 这一组的类型结束位置
  integer :: L,R  ! 用来找A(L)>K及A(R)<K时用的
  integer :: K    ! 记录键值A(S)
  real :: temp ! 交换两个数值时用的
  ! 首先要先给定L,R的初值. L要从头开始,E则要从尾开始
  L=S  
  R=E+1
  ! Right值 > Left值 时才有必要进行排序  
  if ( R<=L ) return

  K=A(S)  ! 设定键值
  do while(.true.)
    ! 找出A(L)<K的所在
    do while( .true. )
      L=L+1
      if ( (A(L) > K) .or. (L>=E) ) exit
    end do
    ! 找出A(R)>K的所在
    do while( .true. )
      R=R-1
      if ( (A(R) < K) .or. (R<=S) ) exit
    end do
    ! 如果Right 跑到 Left的左边时, 循环就该结束了
    if ( R <= L ) exit
    ! 交换A(L),A(R)的数值
    temp=A(L)
    A(L)=A(R)
    A(R)=temp
  end do
  ! 交换A(S),A(R)的数值
  temp=A(S)
  A(S)=A(R)
  A(R)=temp
  ! 把R之前的数据重新分组,再做排序
  call Quick_Sort(A,N,S,R-1)
  ! 把R之后的数据重新分组,再做排序
  call Quick_Sort(A,N,R+1,E)
  return
end subroutine Quick_Sort
                
输入数据

   0.75000   2.50000   3.37500   4.25000   4.75000   5.77310   6.79620   7.81920
   8.84230   9.86540  10.88850  11.91150  12.93460  13.95770  14.98100  16.00400
  17.02700  18.05000  19.15000  19.55000  20.75000  21.65000  22.55000  23.45000
  24.35000  25.25000  25.75000  26.75000  27.71700  28.68300  29.65000  30.67500
  31.70000  32.72500  33.75000  34.75000  35.75000  36.81200  37.87500  38.93800
  40.00000  40.50000  41.00000  41.85000  42.70000  43.55000  44.25000  45.36000
  46.36000  47.36000  48.36000  49.36000  50.36000  51.36000  52.36000  53.36000
  54.36000  55.36000  56.36000  57.36000  58.36000  59.36000  60.36000  61.36000
  62.36000  63.36000  64.36000  65.36000  66.36000  67.36000  68.36000  69.36000
  70.36000  71.36000  72.36000  73.36000  74.36000   1.62500

回复列表 (共3个回复)

沙发


只是将A和tem的属性改为实数 ,源代码中是整数
不明白为什么排不对

板凳

integer :: K    ! 记录键值A(S)
这个也要改成REAL:)

3 楼

按楼上的方法确实可以了,谢谢
并将子程序中的
if ( (A(L) > K) .or. (L>=E) ) exit
改为
      IF (L.LE.E) THEN
          if ((A(L) > K))exit
      ELSE
          EXIT
      ENDIF 

**************************************************
program main
real A(78)

OPEN(11,FILE='result.txt')
OPEN(12,FILE='result1.txt')
read (11,*)(A(I),I=1,78)
DO  I=1,77
    DO K=1,78
    if(A(I)==A(K).and.(K/=I))write(*,*)I,A(K)
    ENDDO
ENDDO
call Quick_Sort(A,78,1,78)
write (12,*)(A(I),I=1,78)
pause
endprogram


recursive subroutine Quick_Sort(A,N,S,E)
implicit none
  integer :: N    ! 表示类型的大小
  real :: A(N) ! 存放数据的类型
  integer :: S    ! 传入的参数, 这一组的类型起始位置
  integer :: E    ! 传入的参数, 这一组的类型结束位置
  integer :: L,R  ! 用来找A(L)>K及A(R)<K时用的
  real :: K    ! 记录键值A(S)
  real :: temp ! 交换两个数值时用的
  ! 首先要先给定L,R的初值. L要从头开始,E则要从尾开始
  L=S  
  R=E+1
  ! Right值 > Left值 时才有必要进行排序  
  if ( R<=L ) return

  K=A(S)  ! 设定键值
  do while(.true.)
    ! 找出A(L)<K的所在
    do while( .true. )
      L=L+1
      IF (L.LE.E) THEN
          if ((A(L) > K))exit
      ELSE
          EXIT
      ENDIF 
    end do
    ! 找出A(R)>K的所在
    do while( .true. )
      R=R-1
      if ( (A(R) < K) .or. (R<=S) ) exit
    end do
    ! 如果Right 跑到 Left的左边时, 循环就该结束了
    if ( R <= L ) exit
    ! 交换A(L),A(R)的数值
    temp=A(L)
    A(L)=A(R)
    A(R)=temp
  end do
  ! 交换A(S),A(R)的数值
  temp=A(S)
  A(S)=A(R)
  A(R)=temp
  ! 把R之前的数据重新分组,再做排序
  call Quick_Sort(A,N,S,R-1)
  ! 把R之后的数据重新分组,再做排序
  call Quick_Sort(A,N,R+1,E)
  return
end subroutine Quick_Sort
                
[em28][em28][em28][em28][em28][em28][em28][em28]

我来回复

您尚未登录,请登录后再回复。点此登录或注册