Помощь - Поиск - Пользователи - Календарь
Полная версия: Процедура сортировки бинарными вставками
Форум «Всё о Паскале» > 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 других метода!!!!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.