Пузырьковая сортировка строк в массиве Fortran 2D - PullRequest
1 голос
/ 14 апреля 2019

Я работаю над второй частью задания, которая просит меня переупорядочить матрицу так, чтобы каждая строка была в монотонно возрастающем порядке и чтобы первый элемент каждой строки монотонно увеличивался. Если две строки имеют одинаковое начальное значение, строки должны быть упорядочены по второму элементу в строке. Если они оба одинаковы, это должен быть третий элемент, продолжающийся до последнего элемента.

Я написал пузырьковую сортировку, которая отлично работает для первой части (переупорядочение каждой строки). Я написал пузырьковую сортировку для второй части (убедившись, что первый элемент каждой строки монотонно увеличивается). Однако я нахожусь в бесконечном цикле, и я не понимаю, почему.

Я понимаю, что проблема в том, что моя переменная inorder в конечном итоге не получает значение true (что приведет к завершению цикла while). Однако я не понимаю, почему inorder не устанавливается в true. Моя логика заключается в следующем: как только следующий код поменял строки до точки, в которой все строки упорядочены, мы еще раз пройдем цикл while (и для inorder будет установлено значение 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 Ответ

2 голосов
/ 15 апреля 2019

Когда вы сравниваете строки, в которых первый элемент идентичен, вы затем просматриваете весь массив и сравниваете каждый элемент.

Так что, если у вас есть два таких массива:

1 5 3
1 2 4

Тогда первый элемент такой же, он входит во вторую часть вашего кода.

На втором месте, 5> 2, поэтому он поменяется местами:

1 2 4
1 5 3

Но тогда это не останавливается. На третьем месте, 4> 3, поэтому он меняет его обратно

1 5 3
1 2 4

А теперь ты вернулся туда, где был.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...