Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2009, 11:55   #21
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Полностью согласен. Обычные выкладки из учебников. Все дружно забыли что человека интереует опыт сортировки строковых данных, а не чисел. Данные по сортировке чисел, ИМХО, топикстартеру известны.
Если паскаль/делфи и сортировка строк по длине, то тут и есть сортировка чисел. Если Си с сишными строками, то тут уже несколько сложнее будет, т.к. длина строки достаточно долго вычисляется. Опять же при сортировке требуется перестановка элементов. Перестановка указателей на строки вероятно будет быстрее, чем:
Код:
temp := str[i];
str[i] := str[k];
str[k] := temp;

Последний раз редактировалось pu4koff; 17.04.2009 в 12:18.
pu4koff вне форума Ответить с цитированием
Старый 17.04.2009, 13:04   #22
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Есть технология Rush More - считаю что самая быстрая сортировка описана там.
Вот еще придумал такую сортировку, поскольку не знаю ее аналогов назвал ее методом индексов.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  function q(a:array of int64):string;
var
  Form1: TForm1;

implementation

{$R *.dfm}
   //********** FUNCTION **********
  function q;
  var i:array of int64;k:integer;
  begin          result:='';
   for k:=0 to length(a) do begin
    if length(i)<a[k] then setlength(i, a[k]+1);
    i[a[k]]:=a[k];
   end;
    for k:=length(i)-2 downto 0 do if i[k]<>0 then
     result:=result+' '+inttostr(i[k]);
  end;
  //********** END FUNCTION ******  {}


procedure TForm1.FormCreate(Sender: TObject);

begin
  caption:=q([1,5,6,9,0,5,0,5,9999,0,2,3,0,2,6,0,2,3,0,3]);
end;

end.
Она правда ресурсоемкая в случае с большими числами, а если диапазон мал, воплне работает быстро.

Если кто знает аналог просьба показать.
I'm learning to live...

Последний раз редактировалось Stilet; 17.04.2009 в 13:50.
Stilet вне форума Ответить с цитированием
Старый 17.04.2009, 13:20   #23
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,810
По умолчанию

Stilet
Судя по идеи - вариант линейной сортировки (смотрите моё предыдущее сообщение). Вот только приведённый пример у меня не сработал.
Arigato вне форума Ответить с цитированием
Старый 17.04.2009, 13:42   #24
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

Мне это несколько напомнило сортировку подсчетом. И почему я её всегда путаю с быстрой сортировкой... В универе неправильно её препод называл или я туплю)
pu4koff вне форума Ответить с цитированием
Старый 17.04.2009, 13:52   #25
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Поправил функу, там баги были
Цитата:
Судя по идеи - вариант линейной сортировки
Понял, дружище, так пускай и будет
Цитата:
Вот только приведённый пример у меня не сработал.
Должно работать. Поправленный код у меня норм работает.
Цитата:
Мне это несколько напомнило сортировку подсчетом.
Похоже.
I'm learning to live...

Последний раз редактировалось Stilet; 17.04.2009 в 13:56.
Stilet вне форума Ответить с цитированием
Старый 17.04.2009, 15:29   #26
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
Я никогда не парюсь с сортировка и всегда сортирую по алгоритму прямого выбора. Этот алгоритм я всегда активно пропагандирую и советую.
общий принцип такой:
Код:
for i:=1 to n-1 do
 for j:=i+1 to n do
  if m[i]<m[j] then <меняем их местами>
для задачи сортировки массива строк по длине этот алгоритм вполне подходит
Если бы это был такой хороший метод, то, наверное, не разрабатывали-бы алгоритм быстрой сортировки:
Код:

procedure Tmain_form.QSS(const list: tList; aFirst, aLast: integer; const aCompare: tCompareFunc);
var
L, R: integer;
pivot, temp: pointer;
begin
   while aFirst < aLast do
   begin
      pivot := list.list[(aFirst + aLast) div 2];
      L := aFirst - 1;
      R := aLast + 1;
      while True do
      begin
         repeat dec(R) until (aCompare(list.list[R], pivot) <= 0);
         repeat inc(L) until (aCompare(list.list[L], pivot) >= 0);

         if L >= R then break;

         temp := List.list[L];
         List.list[L] := List.list[R];
         List.list[R] := temp;
      end;

      if aFirst < R then
         QSS(list, aFirst, R, aCompare);

      aFirst := R + 1;
   end;
end;
Это из книги Бакнелл Джулиан - Фундаментальные алгоритмы и структуры данных в Delphi

Вообще советую почитать, там интересные вещи написаны.
Altera вне форума Ответить с цитированием
Старый 17.04.2009, 15:41   #27
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Altera
Идеальных алгоритмов не бывает.
Бывают оптимальные решения для конкретно поставленной задачи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.04.2009, 16:21   #28
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Идеальных алгоритмов не бывает.
Бывают оптимальные решения для конкретно поставленной задачи.
Та написано, в той книге, что это алгоритм используют повсеместно, в том числе и в Delphi.
Altera вне форума Ответить с цитированием
Старый 17.04.2009, 16:31   #29
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

Цитата:
Сообщение от Altera Посмотреть сообщение
Та написано, в той книге, что это алгоритм используют повсеместно, в том числе и в Delphi.
Ну на заборе тоже много чего написано. На десяти элементах этот алгоритм будет не самый эффективный. Опять же можно сделать быстрее сортировку, но памяти больше дополнительной потребуется. Или у нас массив будет наполовину отсортированный уже - тут уже другой алгоритм лучше отработает. В делфях может и этот алгоритм используется, но там же он выбирался как золотая середина, т.е. по времени неплохо, по расходу памяти нормально, а кого не устраивет результат - пусть пишет алгоритм под свою конкретную задачу
pu4koff вне форума Ответить с цитированием
Старый 17.04.2009, 21:49   #30
Warnes
Пользователь
 
Регистрация: 11.04.2009
Сообщений: 23
По умолчанию

Сколько людей,столько и мнений. Надо как-нибудь протестировать на скорость сортировки.
Warnes вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка многомерного массива на тип сортировки его строк. FatCat Помощь студентам 4 20.12.2008 21:21
Из сортировки массива в сортировку матрици XXXimpulsXXX Помощь студентам 2 12.10.2008 15:11
Какой самый быстрый метод заполнения массива, например двухмерного? SkAndrew Общие вопросы Delphi 11 29.05.2008 13:23
ВИд benjaminfran Софт 2 22.02.2008 08:55
Предложите самый быстрый алгоритм! Gambler Общие вопросы Delphi 6 26.12.2006 22:44