Пузырьковая сортировка строк массива Fortran 2D

#fortran

#fortran

Вопрос:

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

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

Я понимаю, что проблема в том, что моя переменная «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:

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

Итак, если у вас есть два таких массива:

 1 5 3
1 2 4
  

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

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

 1 2 4
1 5 3
  

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

 1 5 3
1 2 4
  

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

Приветствия