Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка строк матрицы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
SunDevil
Есть задача: вводим матрицу 4 на 4 с клавиатуры, а прога должна отсортировать ВСЕ СТРОКИ матрицы по убыванию методом подсчета.
Нем огу реализовать эту процедуру сортировки, ПОМОГИТЕ, ПЛИЗ!
volvo
Читайте здесь (описан сам принцип сортировки матриц): Сортировка строк матрицы. Достаточно заменить метод сортировки на любой необходимый ...
SunDevil
2volvo
Спасибо тебе, но проблема еще и в том, что я не понимаю этот метод подсчета. Совсем не знаю как им сортировать
volvo
Сортировка подсчетом.

Этот метод подходит для сортировки целых чисел из не очень большого диапазона (сравнимого с размером массива). Идея вот в чем: для каждого элемента найти, сколько элементов, меньших определенного числа, и поместить это число на соответствующие место. Делается это так: за линейный проход по массиву мы для каждого из возможных значений подсчитываем, сколько элементов имеют такое значение. Потом добавляем к каждому из найденных чисел суму всех предыдущих. Получая, таким образом, сколько есть элементов, значения которых не больше данного значения. Далее, опять-таки за линейный проход, формируем из исходного массива новый отсортированный. При этом следим, чтобы два одинаковых элемента не были записаны в одно место. Если все равно непонятно, смотрите реализацию:

Код
Program CountingSort;
Var A,B   : array[1..1000] of byte;
   C     : array[byte] of integer;
   N,i    : integer;
Begin
{Определение размера массива A (N) и его заполнение}

{сортировка данных}
for i:=0 to 255 do
C[i]:=0;
for i:=1 to N do
C[A[i]]:=C[A[i]]+1;
for i:=1 to 255 do
C[i]:=C[i-1]+C[i];
for i:=N downto 1 do
begin
 B[C[A[i]]]:=A[i];
 C[A[i]]:=C[A[i]]-1; {здесь мы избегаем возможности записи двух одинаковых чисел в одну ячейку}
end;
{Вывод массива B}

End.
Georgich
Вот исходник, помогите, пожалуйста, а то не работает :molitva:
volvo
Ну, вот так она компилируется... правильность работы не проверял...
Georgich
Не могу все с этой сортировкой разобраться.....тупой какой-то метод, а в универе требуют именно им... Вот таким мотодом сортирую я:
Код
begin
 for i:=1 to n do
   for j:=1 to m do
     for k:=1 to j do
       if a[i,j]<a[i,k] then
         begin
           t:=a[i,j];
           a[i,j]:=a[i,k];
           a[i,k]:=t;
         end;
end.

А как все-таки сделать методом подсчета???
volvo
Вот так:
Код
const
 maxSize = 1000; { Это при желании можно уменьшить }
type
 arrType = array[1 .. maxSize] Of Integer;

procedure sortlines(n,m:integer; var ma:matrix);
var
 _a, _b: arrType;
 _c: array[byte] of integer;
 i,j: integer;
begin
 for j := 1 to n do
   begin
     move(ma[j, 1], _a[1], m*sizeof(integer));

      FillChar(_C[0], 256, 0);
      for i:=1 to N do
        inc(_C[_A[i]]);
      for i:=1 to 255 do
        _C[i]:=_C[i-1]+_C[i];
      for i:=N downto 1 do
        begin
          _B[_C[_A[i]]]:=_A[i];
          dec(_C[_A[i]]);
        end;

     move(_b[1], ma[j, 1], m*sizeof(integer));
   end;
end;

Одно "но" - эта процедура работает, но будет сортировать по возрастанию... Попробуйте переделать ее так, чтобы она сортировала по убыванию...
Georgich
Вот что получается, вернее не получается совсем.... Сделал как в примере, а матрица все равно не сортируется, как ввел, такую и обратно получаю unsure.gif
volvo
Georgich, ну будьте же внимательнее!!! Я же дал готовую процедуру, неужели же надо ОБЯЗАТЕЛЬНО ее изменить, а потом сказать, что она не работает?

Я про внешний цикл:
Цитата
for j := 1 to n do

По-Вашему я что, программы просто так сюда кидаю?
Georgich
2 volvo
есть некоторые вопросы:
Код
const
maxSize = 1000; { Это при желании можно уменьшить }
type
arrType = array[1 .. maxSize] Of Integer;

Это надо писать в модуль Types или оставить в модуле SortLines?
Почему вдруг стало var ma:matrix вместо var a:matrix? Надо тогда все заменять на это ma?
volvo
Вот рабочая версия:
Georgich
2 volvo
БОЛЬШУЩИЕ ТЕБЕ СПАСИБО!
Georgich
Появилась проблема снова с матрицей! Надо отсортировать столбцы матрица по убыванию методом максимума. Я делал вот так:
Код
begin
for i:=1 to n do
  for j:=1 to m do
    for k:=1 to j do
      if a[i,j]<a[i,k] then
        begin
          t:=a[i,j];
          a[i,j]:=a[i,k];
          a[i,k]:=t;
        end;
end.

Но это сортировка строк....Помогите, пожалуйста, а то опять очень срочно надо.....Запутался я уже с этими циклами huh.gif
volvo
Может быть, вот так:
  for j := 1 to m do
   for i := 1 to n do
     for k := 1 to i do
       if a[i, j] < a[k, j] then begin
         t := a[i, j];
         a[i, j] := a[k, j];
         a[k, j] := t;
       end;

smile.gif
Georgich
2 volvo
Это, вроде по возрастанию столбцы сортирует!
begin
for i:=1 to n do
 for j:=1 to m do
   for k:=1 to j do
     begin
       max:=a[i,j];
       if a[i,j]<a[i,k] then
         begin
           t:=a[i,j];
           a[i,j]:=a[i,k];
           a[i,k]:=t;
       end;
     end;
end.

А как по убыванию-то???
volvo
Ну, как у тебя было написано, так я и переделал... Надо по убыванию - поменяй знак с "меньше" на "больше", и все...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.