Помощь - Поиск - Пользователи - Календарь
Полная версия: Процедура сортировки бинарными вставками
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Neon6868
Я написал процедуру сортировки вставки! Помогите её переделать в процедуру сортировки бинарными вставками!!


Procedure sortirovka_vstavkami(a:mas);
var
i,x,y,j:integer;
Begin
for i:=2 to n do begin
x:=a[i];
a[0]:=x;
j:=i;
while x<a[j-1] do begin
y:=y+1;
a[j]:=a[j-1];
j:=j-1;
end;
a[j]:=x;
end;
writeln('Sortirovka vstavkami');
for i:=1 to n do write(a[i]:5);
writeln;
writeln('Chislo sravnenii:',y);
End;


volvo
Зачем что-то ПЕРЕделывать, если можно взять уже сделанное?

http://alglib.sources.ru/sorting/bininssort.php
(там есть исходник на Дельфи, открой его в браузере, и изучай...)
Neon6868
Цитата(volvo @ 12.03.2007 20:10) *

Зачем что-то ПЕРЕделывать, если можно взять уже сделанное?

http://alglib.sources.ru/sorting/bininssort.php
(там есть исходник на Дельфи, открой его в браузере, и изучай...)


Я оттуда прогу взял, а она неправильно работает!!! Самый последний элемент должен быть первым!!!
volvo
Да ты что? Почему у меня тогда вот это:
const n = 20;
var
X: array[0 .. pred(n)] of integer;
i: integer;
begin
for i := 0 to pred(n) do
X[i] := random(50);

for i := 0 to pred(n) do write(X[i]:3);
writeln;

BinaryInsertionSort(X, n);

for i := 0 to pred(n) do write(X[i]:3);
writeln;
end.
выдало совершенно правильный результат:
 27 29 35 42 30 42 27 42 21 31 32 19 21 14 44  2 48 13 19 23
2 13 14 19 19 21 21 23 27 27 29 30 31 32 35 42 42 42 44 48
?
Neon6868
Вот моя прога:


Program sortirovka;
const
n=8;
type
mas=array[0..n] of integer;
var
a:mas;
i,j:integer;
Procedure binarnie_vstavki(a:mas);
var
x,i,j,y,l,m,r,v,k:integer;
Begin
i:=2;
repeat
l:=1;
r:=i-1;
m:=(l+r) div 2;
while l<>m do begin
if a[m-1]>a[i-1] then r:=m
else l:=m;
m:=(l+r) div 2;
end;
if a[l-1]<a[i-1] then begin
if a[i-1]>a[r-1] then l:=r+1
else l:=r;
end;
k:=i;
v:=a[i-1];
while k>l do begin
a[k-1]:=a[k-2];
k:=k-1;
end;
a[l-1]:=v;
i:=i+1;
Until not (i<=n);
writeln('Sortirovka binarnimi vstavkami');
for i:=1 to n do write(a[i]:5);
writeln;
writeln('Chislo sravnenii:',y);
End;
Begin
randomize;
writeln('Isxodnii massiv:');
for i:=1 to n do begin
a[i]:=random(50)-25;
write(a[i]:5);
end;
writeln;
binarnie_vstavki(a);
readln;
End.



Результат:


Исходная матрица:
-1 11 5 24 21 18 23 8
Сортировка бинарными вставками:
0 5 11 18 21 23 24 8

volvo
Почему заполнение от 1 до n? Хотя в программе ЯСНО сказано: от 0 до n-1... Для кого это написано по-твоему?

Добавлено через 1 мин.
Я ж тебе даже пример привел, нет, ты опять по-своему делаешь... Зачем спрашиваешь тогда???
Neon6868
Цитата(volvo @ 12.03.2007 21:22) *

Почему заполнение от 1 до n? Хотя в программе ЯСНО сказано: от 0 до n-1... Для кого это написано по-твоему?

Добавлено через 1 мин.
Я ж тебе даже пример привел, нет, ты опять по-своему делаешь... Зачем спрашиваешь тогда???


Если я делаю от 0 до n-1 то тогда перестают работать 3 других метода!!!!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.