Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2013, 19:37   #1
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию алгоритм пузырька на 2 мерном массиве

не нашел похожий топик.заранее сор за оффтоп)
помогите с алгоритмом сойдет он к учителю или надо ещё усовершенствовать?)
Код:
for n:=1 to 3 do
for z:=1 to 4 do
for i:=1 to 3-n+1 do begin
   for j:=1 to 3 do  begin
    if (i=3-n+1) and (j>3-z+1) then continue;
     if a[i,j]>a[i,j+1] then begin
      x:=a[i,j]; a[i,j]:=a[i,j+1]; a[i,j+1]:=x; end;
   end;
if (i<>3) { ---> нету замены для a[3,4] якобы как a[4,1] } and (a[i,4]>a[i+1,1]) then begin
x:=a[i,4]; a[i,4]:= a[i+1,1]; a[i+1,1]:=x; end;
end;
старался очень приблизить к типу пузырька
Тамерлан Абилов вне форума Ответить с цитированием
Старый 12.07.2013, 19:50   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Еще бы неплохо услышать формулировку задачи (а то только по коду не всегда можно сказать, подойдет или нет: в коде может быть "а + б", а о условию "с * д").
Кстати, в двухмерном массиве еще нужно решить как расставлять элементы (где старший располагать):
построчно;
постолбцово;
спиралью;
еще более хитро
(этот вопрос должен решаться условием задачи).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 12.07.2013, 19:53   #3
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию

честно говоря построчно или постолбцово написать не так то трудно по сравнению с этим и это интереснее)если правильно понял то думаю у мну спиралью)) короче вот так вот чтобы было после отсортировки если рандомно:
1 2 3 4
5 5 6 7
7 8 9 10
вот и вижу уже алгоритм какой запутанный у мну по вашим словам))
п.с. ну и в последок про усовершенствование нужно и бул добавить который будет подтверждать что массив уже отсортирован и прервет цикл.хоть и не сразу прерывает после итераций но тут думаю придумать что то можно)

Код:
for n:=1 to 3 do begin
check:=false;
for z:=1 to 4 do   

for i:=1 to 3-n+1 do begin
   for j:=1 to 3 do  begin
  
     if a[i,j]>a[i,j+1] then begin   check:=true;
      --------------------------------
   end;
--------------
end;
if check=false then break;
end;

Последний раз редактировалось Тамерлан Абилов; 12.07.2013 в 20:10.
Тамерлан Абилов вне форума Ответить с цитированием
Старый 12.07.2013, 20:37   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

У Вас как раз построчно.
Спиралью это, например:
1 2 3
8 9 4
7 6 5
Предлагаю так:
Код:
const
  N = 10;
  M = 10;

type
  tarray = array [1 .. N, 1 .. M] of integer;

var
  a: tarray;
  n1, m1, i, j, tmp, count, x1, y1, x2, y2: integer;
  f: boolean;

begin
  randomize;
  n1 := random(N) + 1;
  m1 := random(M) + 1;
  count := n1 * m1;
  writeln('Before:');
  for i := 1 to n1 do
  begin
    for j := 1 to m1 do
    begin
      a[i, j] := random(11) - 5;
      write(a[i, j]:3);
    end;
    writeln;
  end;
  j := 1;
  repeat
    f := true;
    for i := 1 to count - j do
    begin
      x1 := (i - 1) div m1 + 1;
      y1 := (i - 1) mod m1 + 1;
      x2 := i div m1 + 1;
      y2 := i mod m1 + 1;
      if a[x1, y1] > a[x2, y2] then
      begin
        tmp := a[x1, y1];
        a[x1, y1] := a[x2, y2];
        a[x2, y2] := tmp;
        f := false;
      end;
    end;
    inc(j);
  until f or (j = count);
  writeln('After:');
  for i := 1 to n1 do
  begin
    for j := 1 to m1 do
      write(a[i, j]:3);
    writeln;
  end;
  readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 12.07.2013, 21:01   #5
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию

но мне именно нужно так как я показал выше постом.а построчно я думал это типо каждую строку отдельно сортировать
1 2 3
1 2 6
8 9 11
этот код спирали?до этого мне ещё года 3-4))а если эт построчно то думаю надо думать дня 2))
Тамерлан Абилов вне форума Ответить с цитированием
Старый 12.07.2013, 21:03   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Мне кажется между ТС и BDA возникло недопонимание..

ТС, если Вам ввели матрицу :
Код:
 1 2 3
1 2 4
5 7 6
То что получится в результате?
Poma][a вне форума Ответить с цитированием
Старый 12.07.2013, 21:21   #7
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию

Цитата:
ТС, если Вам ввели матрицу :
Код:

1 2 3
1 2 4
5 7 6
Poma][a,верхний массив был отсортирован это был не ввод
допустим если это ввод то вывод с принципом то что я путал т.е. построчная я думал что это будет выглядить так:
1 2 3
1 2 4
5 6 7
это я так думал что верхняя сортировка построчная по принципу одномерного массива если его разделить на три части как бы сказать думаю понятно.а то что я хочу, и мой исходник вот что делает)
1 5 6 // 1 1 4
8 1 5 -> 5 5 6
4 8 10 // 8 8 10
но в исходнике то что на первом посту массив 3 на 4)

не знаю какому типу относится мой исход но я сказал спираль потому что путь сортировки получается такой
Изображения
Тип файла: jpg mas.jpg (8.5 Кб, 115 просмотров)

Последний раз редактировалось Тамерлан Абилов; 12.07.2013 в 21:42.
Тамерлан Абилов вне форума Ответить с цитированием
Старый 12.07.2013, 21:32   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Мой код выполняет как раз Вашу сортировку (можете проверить, запустив).
Под "построчно", "постолбцово" я имел ввиду обход всей матрицы, а не сортировку каждого столбца/строки.
Построчно:
1 2 3 4
5 6 7 8
Постолбцово:
1 4
2 5
3 6

Я не могу гарантировать, что Ваш код работает 100% - не проверял (да и на свой гарантий не даю ). Смысл в том, что все элементы двухмерного массива нумеруются от 1 до N*M (N - количество строк матрицы, M - столбцов), затем берутся i и i + 1 элементы и сравниваются. В принципе, код можно переписать так:
Код:
const
  N = 10;
  M = 10;

type
  tarray = array [1 .. N, 1 .. M] of integer;

var
  a: tarray;
  n1, m1, i, j, count: integer;
  f: boolean;

procedure swap(var b: tarray; k, n2, m2: integer; var t: boolean);
var
  x1, y1, x2, y2, tmp: integer;
begin
  x1 := (k - 1) div m2 + 1;
  y1 := (k - 1) mod m2 + 1;
  x2 := k div m2 + 1;
  y2 := k mod m2 + 1;
  if b[x1, y1] > b[x2, y2] then
  begin
    tmp := b[x1, y1];
    b[x1, y1] := b[x2, y2];
    b[x2, y2] := tmp;
    t := false;
  end;
end;

begin
  randomize;
  n1 := random(N) + 1;
  m1 := random(M) + 1;
  count := n1 * m1;
  writeln('Before:');
  for i := 1 to n1 do
  begin
    for j := 1 to m1 do
    begin
      a[i, j] := random(11) - 5;
      write(a[i, j]:3);
    end;
    writeln;
  end;
  j := 1;
  repeat
    f := true;
    for i := 1 to count - j do
      swap(a, i, n1, m1, f);
    inc(j);
  until f or (j = count);
  writeln('After:');
  for i := 1 to n1 do
  begin
    for j := 1 to m1 do
      write(a[i, j]:3);
    writeln;
  end;
  readln;
end.
Тогда остается переписывать только функцию swap, а именно расчет x1, y1, x2, y2, для того, чтобы менять направление сортировки.
Грубо говоря, происходит преобразование из одномерной системы координат {1..N*M} в двухмерную {1..N,1..M}. Выбор преобразования задает способ обхода.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 12.07.2013 в 21:47.
BDA на форуме Ответить с цитированием
Старый 12.07.2013, 21:47   #9
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию

да нумеруются от 1 до н*м.просто тогда не легче взять все это записать на одномерный и проверять так?я тоже думал так но при этом такую операцию сделать сложно если дать аналогию одномерного:
Код:
i:= 1 to n do
j:=1 to n-i do
если это одномерный с I-числами итераций то в двухмерном дать такой алгоритм с уже готовым н* м я не много труднее представляю))я просто думал проверить мой алгоритм годен ли он понятен ли сойдет ли т.д..
а ваш вариант обязательно посмотрю просто для меня он как бы алгоритм из другой планеты не приходилось на такие вещи сталкиваться))


п.с. а вот для
Код:
 n-i
дать аналогию на двумерном это уже какой то алгоритм вот и наковырял.
Тамерлан Абилов вне форума Ответить с цитированием
Старый 12.07.2013, 21:56   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Я не могу написать сортировку пузырьком без пол-литра без википедии (Сортировка пузырьком), так как не использую ее.
По примеру оттуда:
Код:
for j := 1 to n - 1 do
begin
  f := true;
  for i := 1 to n - j do
    if a[i] > a[i + 1] then
    begin
        swap(a[i], a[i + 1]);
        f := false;
    end;
    if f then <выход из цикла>
end;
Я написал ровно то же самое, но, так как массив не одномерный, а двухмерный, то нужно как-то узнать, какой элемент двухмерного массива соответствует номеру i.

Насчет вариантов сортировки - еще можно змейкой:
1 2 3 4
8 7 6 5
9 10 11 12

Для меня сложнее понять Ваши проверки, чем сделать преобразование из одних "координат" в другие.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 12.07.2013 в 22:02.
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как определить наименьший нечетный элемент в двух мерном массиве ВДПУ Помощь студентам 13 27.05.2012 13:35
Добавление флага в алгоритм сортировки способом пузырька (С++) Johnny_Grunge Помощь студентам 0 23.01.2012 21:33
Задача на зачёт. Поиск элементов в 1-мерном массиве oRik24 Помощь студентам 7 16.06.2011 11:04
Алгоритм поиска в массиве elpilasgsm Помощь студентам 10 18.05.2011 17:30