Помощь - Поиск - Пользователи - Календарь
Полная версия: Swap
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
suriv
Можно поподробнее про ф-цию swap:
В одной книге писалось про пузырьковую сортировку:
Цитата
for i:=1 to 10 do
if m[i] > m[i+1] then swap (m[i],m[i+1]);

Но ведь у ф-ции swap должен быть один параметр.
В результатате чего вызывает ошибку.


З.Ы. как я понял ф-ция swap меняет местами....(какую то хрень).
volvo
suriv
Не путай... В Паскале есть встроенная функция Swap, которая получает число типа Word или Integer, и меняет в нем старший и младший байты местами.
Для функции сортировки нужен другой Swap, который нужно писать самому - это должна быть процедура, которая обменивает значения 2-х переменных, т.е. вот так:
Код

Procedure Swap(a, b: Integer); {хотя тип может быть и другим}
 Var T: Integer;
 Begin
   T := a; a := b; b := T
 End;


Напиши эту процедуру перед процедурой сортировки, и не будет никаких ошибок :D
Altair
Да, совершенно верно.. можно вообще обойтись без вызова процедуры, хотя так код более структурирован.

Кстати здесь:
Код
T := a; a := b; b := T

Можно обойтись без дополнительной переменной T !
smile.gif
volvo
Oleg_Z
Для новичка лучше все-таки использовать Т smile.gif
Altair
Зато:
1. меньше код.
2. быстрее. smile.gif
3. меньше по размеру.
4. уже не будет новичком smile.gif
5. Меньше памяти на 2 байта smile.gif

:P
smile.gif
Цитата
Но ведь у ф-ции

Кстати это процедура rolleyes.gif
Digitalator
!!! Самый быстрый своп:
Код

asm
xor a,b
xor b,a
xor a,b
end;


Не самый! Самый быстрый с использованием доп. переменной! ВFAQ'e доказательство!
murphy
Цитата
Можно обойтись без дополнительной переменной T !

Как?
А то я не помню а сам не додумаюсь нинак :p2:
volvo
murphy
Код

a := a + b;
b := a - b;
a := a - b;
:D
murphy
volvo

Спасибо
я приблизительно так и пытался но чего-то запутался
:D
Digitalator
Цитата
Код
a := a + b;
b := a - b;
a := a - b;

Ксорами быстрее будит smile.gif ... и красивее

p.S. неправда! Самый быстрый обмен с использованием доп. переменной. В FAQ'e есть доказательство.
CMOS
Хорошо, а как написать процедуру для переменных любых типов? Т. е.:

procedure swap(var x, y)

Я нашел способ, только нужно указывать размер перемнной:

Код
Procedure Swap (var a, b; size: Word);
var p: Pointer;
Begin
GetMem (p, size);
Move (a, p^, size);
Move (b, a, size);
Move (p^, b, size);
FreeMem (p, size);
End;
;)

Код в теги заключаем...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.