Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Адресная сортировка


Автор: ftp27host 26.8.2010, 21:25
Напишите, пожалуйста, пример адресной сортировки. По скудным описаниям в интернете никак не пойму как она вообще работает :(

Автор: THandle 27.8.2010, 13:45
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена!

Добавлено через 32 секунды
ftp27host, а можешь дать хоть какое то описание данной сортировки?

Автор: kemiisto 27.8.2010, 14:04
Возможно речь идёт о сортировке вставками (Insertion sort). Или есть ещё http://www.durangobill.com/SortAlgorithms/Sort_Source_Code.html. Там тоже для каждого элементам вычисляется его адрес в отсортированном массиве.

Автор: ftp27host 31.8.2010, 23:26
Цитата

Вот про адресную сор-ку:используется для целых чисел не очень большого диапазона. Идея сортировки: для каждого элемента массива определить количество элементов меньше его находящихся в данном массиве, после чего поместить этот элемент на соответствующее место. Сор-ка проходит следующим образом: за линейный проход для каждого значения подсчитываем сколько раз он втречается в данном массиве, затем определяем сумму всех предыдущих элементов и таким образом получаем позицию для вставки соответствующего элемента (опять за линейный прход). Необходимо следить, чтобы 2 одинаковых эл-та не были записаны на одно и то же место.
Код

var mas: array [0..n] of byte;
a: array [byte] of o..n;
for i:= 0 to n do a[mas[i]] :=a[mas[i]]+1;
k:=0;
s:=0;
for i:=0 to 255 do
if a[i] <>0 then
begin
s:=s+a[i];
while k+1<>s do begin k:=k+1;
mas[k]:=i;
end;
end.



Автор: kemiisto 1.9.2010, 00:16
Ну, если допустить, что описание дурацкое, то это http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82%D0%BE%D0%BC#.D0.9A.D0.BE.D0.BC.D0.BF.D0.BE.D0.BD.D0.B5.D0.BD.D1.82.D0.BD.D1.8B.D0.B9_.D0.9F.D0.B0.D1.81.D0.BA.D0.B0.D0.BB.D1.8C (Counting sort). 

Код

PROGRAM Sort;

CONST
  n = 8;
  k = 100;

TYPE
  IntegerArray = ARRAY [0..n-1] OF INTEGER;

PROCEDURE Fill(var a: IntegerArray);
BEGIN
  a[0] := 44;
  a[1] := 55;
  a[2] := 12;
  a[3] := 42;
  a[4] := 94;
  a[5] := 18;
  a[6] := 06;
  a[7] := 67;  
END;  
  
PROCEDURE Print(a: IntegerArray);
VAR
  i: INTEGER;
BEGIN
  FOR i := 0 TO n - 1 DO
    Write(a[i], ' ');
  Writeln;
END;  

PROCEDURE CountingSort(VAR a: IntegerArray);
VAR
  i, j, b: INTEGER; 
  c: ARRAY [0..k-1] OF INTEGER;
BEGIN
  FOR i := 0 TO n - 1 DO
    c[i] := 0;
  FOR i := 0 TO n - 1 DO
    Inc(c[a[i]]);
  b := 0;
  FOR j := 0 TO k - 1 DO
    FOR i := 0 TO c[j] - 1 DO
    BEGIN
      a[b] := j;
      b := b + 1;
    END;
END;

VAR ia: IntegerArray;
  
BEGIN
  Fill(ia);
  Print(ia);
  CountingSort(ia);
  Print(ia);
END.


Автор: ftp27host 1.9.2010, 12:46
Спасибо, kemiisto. Немного переделал и все сработало.
p.s. Какой нерациональный алгоритм >.>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)