IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Сортировка строк матрицы
SunDevil
сообщение 17.03.2005 19:35
Сообщение #1


Гость






Есть задача: вводим матрицу 4 на 4 с клавиатуры, а прога должна отсортировать ВСЕ СТРОКИ матрицы по убыванию методом подсчета.
Нем огу реализовать эту процедуру сортировки, ПОМОГИТЕ, ПЛИЗ!
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 16)
volvo
сообщение 17.03.2005 19:43
Сообщение #2


Гость






Читайте здесь (описан сам принцип сортировки матриц): Сортировка строк матрицы. Достаточно заменить метод сортировки на любой необходимый ...
 К началу страницы 
+ Ответить 
SunDevil
сообщение 17.03.2005 19:55
Сообщение #3


Гость






2volvo
Спасибо тебе, но проблема еще и в том, что я не понимаю этот метод подсчета. Совсем не знаю как им сортировать
 К началу страницы 
+ Ответить 
volvo
сообщение 17.03.2005 20:13
Сообщение #4


Гость






Сортировка подсчетом.

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

Код
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
сообщение 17.03.2005 22:47
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Вот исходник, помогите, пожалуйста, а то не работает :molitva:


Прикрепленные файлы
Прикрепленный файл  LAB2.rar ( 2.09 килобайт ) Кол-во скачиваний: 146
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.03.2005 23:03
Сообщение #6


Гость






Ну, вот так она компилируется... правильность работы не проверял...


Прикрепленные файлы
Прикрепленный файл  lab2.rar ( 1.04 килобайт ) Кол-во скачиваний: 135
 К началу страницы 
+ Ответить 
Georgich
сообщение 20.03.2005 14:22
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Не могу все с этой сортировкой разобраться.....тупой какой-то метод, а в универе требуют именно им... Вот таким мотодом сортирую я:
Код
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.

А как все-таки сделать методом подсчета???

Сообщение отредактировано: Georgich - 20.03.2005 14:23
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.03.2005 14:26
Сообщение #8


Гость






Вот так:
Код
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
сообщение 20.03.2005 16:37
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Вот что получается, вернее не получается совсем.... Сделал как в примере, а матрица все равно не сортируется, как ввел, такую и обратно получаю unsure.gif


Прикрепленные файлы
Прикрепленный файл  Lab2.rar ( 2.54 килобайт ) Кол-во скачиваний: 118
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.03.2005 16:47
Сообщение #10


Гость






Georgich, ну будьте же внимательнее!!! Я же дал готовую процедуру, неужели же надо ОБЯЗАТЕЛЬНО ее изменить, а потом сказать, что она не работает?

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

По-Вашему я что, программы просто так сюда кидаю?
 К началу страницы 
+ Ответить 
Georgich
сообщение 20.03.2005 16:55
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


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

Это надо писать в модуль Types или оставить в модуле SortLines?
Почему вдруг стало var ma:matrix вместо var a:matrix? Надо тогда все заменять на это ma?

Сообщение отредактировано: Georgich - 20.03.2005 16:56
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.03.2005 17:01
Сообщение #12


Гость






Вот рабочая версия:


Прикрепленные файлы
Прикрепленный файл  lab2.rar ( 1.13 килобайт ) Кол-во скачиваний: 132
 К началу страницы 
+ Ответить 
Georgich
сообщение 20.03.2005 17:48
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


2 volvo
БОЛЬШУЩИЕ ТЕБЕ СПАСИБО!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Georgich
сообщение 18.04.2005 10:51
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Появилась проблема снова с матрицей! Надо отсортировать столбцы матрица по убыванию методом максимума. Я делал вот так:
Код
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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.04.2005 11:00
Сообщение #15


Гость






Может быть, вот так:
  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
сообщение 18.04.2005 11:13
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


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.

А как по убыванию-то???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.04.2005 11:16
Сообщение #17


Гость






Ну, как у тебя было написано, так я и переделал... Надо по убыванию - поменяй знак с "меньше" на "больше", и все...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 7:36
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"