主题:将彭国伦快速排列的程序改为实数组后 运行后排列顺序不对
代码如下 也可见附件,观测结果中得数据 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
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