Страница 1 из 1

Упорядочивание массива (пузырьковый метод)

Добавлено: 29 июн 2007, 10:43
Хыиуду
Кусок кода, который упорядочивает массив a[1..N] по возрастанию его элементов. Переменные i,j - целые, temp имеет тот же тип, что и элементы массива

Код: Выделить всё

for i:=1 to N do
  for j:=1 to N-i do
     if a[j]>a[j+1] then
     begin
          temp:=a[j];
          a[j]:=a[j+1];
          a[j+1]=temp;
     end;
Если массив должен упорядочиваться не по возрастанию, а по убыванию, вместо a[j]>a[j+1] ставится a[j]<a[j+1].
Если элементы массива - не числа, а записи, и упорядочивать надо по какому-то полю этой записи (например, записи о сотрудниках упорядочить по их возрасту), условие будет выглядеть примерно так: a[j].vozrast>a[j+1].vozrast

Re: Упорядочивание массива (пузырьковый метод)

Добавлено: 29 июн 2007, 11:40
BBB
Хыиуду,
1. когда во внешнем цикле i достигнет значения N, а во внутреннем j достигнет занчения i (т.е. в данном случае - N) то получим выход за пределы массива:

Код: Выделить всё

if a[N]>a[N+1] then
     begin
          temp:=a[N];
          a[N]:=a[N+1];
          a[N+1]=temp;
     end;
2. Кроме того, помнится, в пузырьковой сортировке проходы делаются "сверху донизу полностью", а не "сверху до i-го элемента".

Re: Упорядочивание массива (пузырьковый метод)

Добавлено: 29 июн 2007, 13:59
Хыиуду
упс... мой косяк. Исправил
Правда, проходы делаются не полностью: после первого прохода максимальный элемент и так уже находится на последнем месте, поэтому проверять его смысла нет, на втором - второй по значению, и т.д.

Re: Упорядочивание массива (пузырьковый метод)

Добавлено: 12 дек 2007, 11:11
Хыиуду
Как вариант - если надо упорядочивать по какой-то функции, это будет выглядеть так:
for i:=1 to N do
for j:=1 to N-i do
if func(a[j])>func(a[j+1]) then
begin
temp:=a[j];
a[j]:=a[j+1];
a[j+1]=temp;
end;

Тогда надо еще описывать саму функцию. Например, если массив состоит из чисел, и надо их упорядочить по возрастанию/убыванию, то это тривиальный вариант - func(x)=x. Если надо упорядочивать, скажем, по сумме цифр числа, то функция будет выглядеть примерно так:

Код: Выделить всё

func(x:integer):integer;
var s:integer;
begin
  s:=0;
  while x>0 do 
  begin
     s:=s+x mod 10;
     x:=x div 10;
  end;
  func:=s;
end;

Re: Упорядочивание массива (пузырьковый метод)

Добавлено: 20 мар 2008, 15:03
Хыиуду
Если упорядочивать надо массив записей по какому-нибудь полю (например, данные о студентах):
type TStudent=record
name, surname: string;
age, faculty: integer;
end;
- естественно, что типы полей могут быть самыми разными. Но, допустим, нам надо упорядочить список этих студентов по возрасту, при этом список описан как var A: array[1..N] of TStudent

Код: Выделить всё

for i:=1 to N do
  for j:=1 to N-i do
     if a[j].age>a[j+1].age then
     begin
          temp:=a[j];
          a[j]:=a[j+1];
          a[j+1]=temp;
     end;
При этом переменная temp должна иметь тот же тип, что и любой элемент массива, т.е. TStudent

Re: Упорядочивание массива (пузырьковый метод)

Добавлено: 23 мар 2008, 19:34
Anton_XXX
Спасибо большое Хыиуду, за краткое изложение!

Я был бы вам признателен, еслиб вы еще также подробно изложли о сортировки двумерного массива...

Re: Упорядочивание массива (пузырьковый метод)

Добавлено: 24 мар 2008, 11:15
Хыиуду
Собственно, каждая строка двухмерного массива (или каждый столбец) - это одномерный массив. А как сортируется одномерный - уже известно.
Например, если сортировать массив NxM по примеру из первого поста

Код: Выделить всё

for K:=1 to M do
for i:=1 to N do
  for j:=1 to N-i do
     if a[j,K]>=a[j+1,K] then
     begin
          temp:=a[j,K];
          a[j,K]:=a[j+1,K];
          a[j+1,K]=temp;
    end;
Индексы могут меняться местами - смотря с какого места вы смотрите на вашу матрицу. Например, A[j, К] заменяется на A[K, j].

Re: Упорядочивание массива (пузырьковый метод)

Добавлено: 03 фев 2009, 09:43
atavin-ta
Хыиуду писал(а): for i:=1 to N do
for j:=1 to N-i do
if a[j]>a[j+1] then
begin
temp:=a[j];
a[j]:=a[j+1];
a[j+1]=temp;
end;
[/code]

глюк в диапазонах и в использовании индексов в теле внутреннего цикла. Правильно:
for i:=1 to N-1 do
for j:=i+1 to N do
if a[j]>a then
begin
temp:=a[j];
a[j]:=a;
a[j+1]=temp;
end;

Re: Упорядочивание массива (пузырьковый метод)

Добавлено: 19 апр 2010, 13:02
Fudo

Код: Выделить всё

for i:=1 to n-1 do
  for j:=i+1 to n do
    if a[j]>a[i] then
     begin
       temp:=a[j];
       a[j]:=a[i];
       a[i]:=temp;
     end;
Правильно так)))) Или Вы уже специально делаете ошибки? хД