Страница 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;
Правильно так)))) Или Вы уже специально делаете ошибки? хД