PDA

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



Хыиуду
29.06.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

BBB
29.06.2007, 11:40
Хыиуду,
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-го элемента".

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

Хыиуду
12.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;

Хыиуду
20.03.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

Хыиуду
24.03.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].

atavin-ta
03.02.2009, 09:43
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[i] then
begin
temp:=a[j];
a[j]:=a[i];
a[j+1]=temp;
end;

Fudo
19.04.2010, 13:02
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;


Правильно так)))) Или Вы уже специально делаете ошибки? хД