对Fortran 2D阵列的行进行气泡排序

时间:2019-04-14 18:56:31

标签: fortran

我正在研究作业的第二部分,该作业要求我对矩阵进行重新排序,以使每一行以单调递增的顺序,从而使每一行的第一个元素单调递增。如果两行具有相同的初始值,则应按行中的第二个元素对行进行排序。如果两者相同,则应该是第三个元素,一直到最后一个元素。

我写了一个冒泡排序,该冒泡排序对于第一部分效果很好(重新排列每一行)。我为第二部分编写了冒泡排序(确保每行的第一个元素单调递增)。但是,我陷入了无限循环,我不明白为什么。

我确实知道问题是我的“有序”变量最终没有设置为true(这将结束while循环)。但是,我不明白为什么未将inorder设置为true。我的逻辑是这样的:一旦以下代码将行交换到行全部按顺序排列的点,我们将再经过while循环一遍(并且order将设置为true),这将导致while循环结束。我为为什么没有发生而感到困惑。

inorder = .false.
loopA: do while ( .not. inorder ) !While the rows are not ordered
    inorder = .true.
        loopB: do i = 1, rows-1 !Iterate through the first column of the array
            if (arr(i,1)>arr(i+1,1)) then !If we find a row that is out of order
                inorder = .false.
                tempArr = arr(i+1,:) !Swap the corresponding rows
                arr(i+1,:) = arr(i,:)
                arr(i,:) = tempArr
            end if

            if (arr(i,1)==arr(i+1,1)) then !The first elements of the rows are the same
                loopC: do j=2, cols !Iterate through the rest of the row to find the first element that is not the same
                    if (arr(i,j)>arr(i+1,j)) then !Found elements that are not the same and that are out of order
                        inorder = .false.
                        tempArr = arr(i+1,:) !Swap the corresponding rows
                        arr(i+1,:) = arr(i,:)
                        arr(i,:) = tempArr
                    end if
                end do loopC
           end if
        end do loopB
end do loopA

示例输入:

  6    3    9   23   80
  7   54   78   87   87
 83    5   67    8   23
102    1   67   54   34
 78    3   45   67   28
 14   33   24   34    9

示例(正确)输出(我的代码未生成):

  1   34   54   67  102
  3    6    9   23   80
  3   28   45   67   78
  5    8   23   67   83
  7   54   78   87   87
  9   14   24   33   34

盯着这个看了几个小时也有可能让我错过了一些愚蠢的事情,所以我感谢任何指点。

1 个答案:

答案 0 :(得分:2)

当要比较第一个元素相同的行时,然后遍历整个数组并比较每个项目。

因此,如果您有两个这样的数组:

1 5 3
1 2 4

然后第一个元素相同,它将输入代码的第二部分。

第二位5> 2,因此将其交换:

1 2 4
1 5 3

但是它并没有停止。第三名4> 3,因此将其交换回去

1 5 3
1 2 4

现在您回到了原来的位置。

欢呼