сортировка по возрастанию

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Рина
Сообщения: 7
Зарегистрирован: 31 мар 2006, 00:18
Откуда: Новосибирск
Контактная информация:

помогите пожалуйста сделать сортировку по возрастанию и отобразить это в StringGrid
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Сортировку чего?
[syntax=Delphi] [/syntax]
Рина
Сообщения: 7
Зарегистрирован: 31 мар 2006, 00:18
Откуда: Новосибирск
Контактная информация:

сортировку чисел
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Отобразить в StringGrid можно с помощью разных методов типа loadfromfile итд итп
Если числа представленны в виде массива, то к примеру можно отсортировать методом Шелла

Код: Выделить всё

Procedure Sort( var a : seq);  // а - массив //
Var 
  d, i, t : integer;
  k : boolean; // пpизнак пеpестановки //
begin
  d:=N div 2;  // начальное значение интеpвала //
  while d>0 do begin // цикл с yменьшением интеpвала до 1 //
  // пyзыpьковая соpтиpовка с интеpвалом d //  
     k:=true; 
     while k do begin  // цикл, пока есть пеpестановки //
       k:=false; i:=1;
       for i:=1 to N-d do begin
         // сpавнение эл-тов на интеpвале d //
         if a[i]>a[i+d] then begin
           t:=a[i]; a[i]:=a[i+d]; a[i+d]:=t; // пеpестановка //
           k:=true;  // пpизнак пеpестановки //
           end; 
         end;
       end;
     d:=d div 2; // yменьшение интеpвала //
     end;
 end;
Цифpовая соpтиpовка (pаспpеделение)

Код: Выделить всё

const D=...;  // максимальное количество цифp в числе//
      P=...;   // основание системы счисления //
 Function Digit(v, n : integer) : integer;
 // возвpащает значение n-ой цифpы в числе v //
 begin
   for n:=n downto 2 do v:=v div P;
   Digit:=v mod P;
 end;
 Procedure Sort(var a : Seq);
   Var b : array[0..P-2] of integer; // индекс элемента,
                          следyющего за последним в i-ой гpyппе //
       i, j, k, m, x : integer;
   begin
     for m:=1 to D do begin   // пеpебоp цифp, начиная с младшей //
     for i:=0 to P-2 do b[i]:=1; // нач. значения индексов //
     for i:=1 to N do begin  // пеpебоp массива //
       k:=Digit(a[i],m);      // опpеделение m-ой цифpы//
       x:=a[i];
       // сдвиг - освобождение места в конце k-ой гpyппы//
       for j:=i downto b[k]+1 do a[j]:=a[j-1];
       // запись в конец k-ой гpyппы //
       a[b[k]]:=x;
       // модификация k-го индекса и всех больших //
       for j:=k to P-2 do b[j]:=b[j]+1;
       end;
 end;
Далее можно отсортировать в самом StringGrid

Код: Выделить всё

 program StringGrid;
 uses WinCrt, SysUtils;
   const
     min = 10;
     max = 13;
     maxHeap = 1 shl max;
   type
     heap = array [1..maxHeap] of integer;
     heapBase = ^heap;
   var
     currentSize, heapSize: integer;
     A: heapBase;

procedure SwapInts (var a, b: integer);
   var
     t: integer;
   begin
     t := a;
     a := b;
     b := t
   end;

procedure InitHeap (size: integer);
   var
     i: integer;
   begin
     heapSize := size;
     currentSize := size;
     Randomize;
     for i := 1 to size do
       A^[i] := Random(size) + 1;
   end;

procedure Heapify (i: integer);
   var
     left, right, largest: integer;
   begin
     largest := i;
     left := 2 * i;
     right := left + 1;
     if left <= heapSize then
       if A^[left] > A^[i] then
         largest := left;
     if right <= heapSize then
       if A^[right] > A^[largest] then
         largest := right;
     if largest <> i then
       begin
         SwapInts (A^[largest], A^[i]);
         Heapify (largest)
       end
   end;

procedure BuildHeap;
   var
     i: integer;
   begin
     for i := heapSize div 2 downto 1 do
       Heapify (i)
   end;

procedure HeapSort;
   var
     i: integer;
   begin
     BuildHeap;
     for i := currentSize downto 2 do
       begin
         SwapInts (A^[i], A^[1]);
         dec (heapSize);
         Heapify (1)
       end
   end;
 type
   TAvgTimes = array [min..max] of TDateTime;
 var
   sTime, eTime, tTime: TDateTime;
   i, idx, size: integer;
   avgTimes: TAvgTimes;
 begin
   tTime := 0;
   i := min;
   size := 1 shl min;
   new (A);
   while i <= max do
     begin
       for idx := 1 to 10 do
         begin
           InitHeap (size);
           sTime := Time;
           HeapSort;
           eTime := Time;
           tTime := tTime + (eTime - sTime)
         end;
       avgTimes[i] := tTime / 10.0;
       inc (i);
       size := size shl 1;
     end;
 end.
Рина
Сообщения: 7
Зарегистрирован: 31 мар 2006, 00:18
Откуда: Новосибирск
Контактная информация:

огромное человеческое спасибо
SkunkLover
Сообщения: 5
Зарегистрирован: 03 апр 2006, 23:23
Контактная информация:

У меня тоже есть вопрос по сортировке... Чтото не могу придумать как отсортировать переменные стрингового типа... Нужно сделать сортировку методом прямого слияния по-алфавиту и наоборот... Подскажите плз...
welcome to furry world
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

переменные стрингового типа
- это массив?
SkunkLover
Сообщения: 5
Зарегистрирован: 03 апр 2006, 23:23
Контактная информация:

уже понял как стринговые типы сортируюся в дельфе... ТОлько вот чтото не работает она у меня, чтото с циклами напутал :/
Вобщем - дан структурированный файл... (информация которая в таблицу заносится)... вот и нужно сделать чтоб сортировало таблицу, прямо в файле...
welcome to furry world
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Если в файле до 1 - 3 тысяч строк, то можно смело затащить в TStrings (или TStringList... Посмотрите, который из них не абстрактный), отсортировать (есть там готовый метод для этого) и сохранить обратно. (Если строк больше, то тоже можно, но только осторожно).

Хотя, если это задача из домашнего задания по информатике, то такое решение использовать нельзя. Надо будет изобретать свой велосипед, а не кататься на Borland VCL-е.
Ответить