#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
И теперь вы вернулись туда, где были.
Приветствия