Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

Любимый метод сортировки   Найти похожие ветки 

 
Marser ©   (2005-11-14 18:31) [0]

Если нужно быстро написать код для сортировки одномерного массива, не используя дополнительные библиотеки и литературу, каким методом вы воспользуетесь скорее всего?

Вопрос возник после того, как препод выдал мне задание на сортировку(по возрастанию или убыванию в зависимости от параметра) массива памяти в AVR AT90. Задачу я решил быстро, применив свой излюбленный метод, до которого в своё время дошёл сам.

После защиты у меня возник вопрос - а как же этот метод называется в цивлизванном мире? Оказалось - "сортировка выбором", метод не лучший, но и не худший. Перевооружаться, конечно, буду, но вот стало интересно, что используют другие.


 
Kerk ©   (2005-11-14 18:34) [1]

Если нужно быстро написать, то напишу пузырек. Если несовсем быстро, то подумаю о других.

А быстрей всего написать TStringList.Sort :)


 
Игорь Шевченко ©   (2005-11-14 18:35) [2]

TList.Soft(compare function)


 
default ©   (2005-11-14 18:36) [3]

если числа целые и размерность их не высока то сортировка подсчётом рулит немеряно


 
Юрий Зотов ©   (2005-11-14 18:36) [4]

Сначала прикидываю возможное число сортируемых элементов и реальные требования к времени исполнения процедуры, а уж от этого и пляшу.


 
default ©   (2005-11-14 18:37) [5]

Kerk ©   (14.11.05 18:34) [1]
пузырь, ты что:)
хотя когда разупорядоченность невелика он рулит


 
Marser ©   (2005-11-14 18:39) [6]


> А быстрей всего написать TStringList.Sort :)


> TList.Soft(compare function)

В AT90 ? :-)
Причём, на чистом асме, даже не на С. Впрочем, я уместился в надцать строк :-)


 
Kerk ©   (2005-11-14 18:41) [7]

default ©   (14.11.05 18:37) [5]
пузырь, ты что:)


А мне редко приходится что-то сортировать вручную. А если и сортирую, то пару десятков элементов.

TList.Sort и ...ORDER BY рулят


 
Mystic ©   (2005-11-14 18:52) [8]

Если в указаной архитектуре можно легко реализовать рекурсию, то скорее всего буду реализовывать быструю сортировку.


 
Гаврила ©   (2005-11-14 19:06) [9]

Как то раз, очень давно, была задача отсортировать TList, содержащий очень много элементов (миллион и более)
Вызов Sort работал неприемлимо по времени, придумал вот что:
создаю второй TList в него переношу элементы из первого (вставка в сразу нужное место методом деления на два)
потом старый подменяю на новый

Как вы считаете - нормально придумал? Или отстой? :-)


 
programania ©   (2005-11-14 19:25) [10]

Метод Шелла самый простой из самых быстрых
1млн за 1сек на С2800

var
m:array of integer;
q:integer=1000000;

{$R *.DFM}
PROCEDURE sort;
var i,j1,g1,r,e:integer;
begin
//сортировка массива чисел m размером q
g1:=q;
while g1>0 do begin
 g1:=g1 div 2;
 i:=g1;
 while i<q do begin
   j1:=i-g1+1;
   while (j1>=1) and (m[j1]>m[j1+g1]) do begin
     r:=j1+g1;
     e:=m[j1]; m[j1]:=m[r]; m[r]:=e;
     dec(j1,g1)
   end;
   inc(i);
 end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
setLength(m,q+1);
for i:=1 to q do m[i]:=random(q);
sort;
end;


 
Sergey Masloff   (2005-11-14 20:51) [11]

Гаврила ©   (14.11.05 19:06) [9]
>Как вы считаете - нормально придумал? Или отстой? :-)
А сам-то как думаешь? Задачу решил? Быстрее стало? - рулез. Нет? - ацтой ;-))


 
pasha_golub ©   (2005-11-14 21:25) [12]


> Гаврила ©   (14.11.05 19:06) [9]


TList - это значит указатели таскать... Наверное, можно было бы и без доп.списка.


> default ©   (14.11.05 18:37) [5]
>
> Kerk ©   (14.11.05 18:34) [1]
> пузырь, ты что:)


Классный метод. Особенно с некоторыми улучшениями вполне отвечает заданным начальным условиям. Особенно при теперешнем развитии техники, по-моему, абсолютно монописуально за 0,000002 или 0,000001 выполнится работа. Вот жили бы мы в годах 50, я бы воспринял ваш пост как стоящий. А на данный момент, это просто немножко понтов... ;0)


 
default ©   (2005-11-14 22:19) [13]

pasha_golub ©   (14.11.05 21:25) [12]
"Особенно при теперешнем развитии техники, по-моему, абсолютно монописуально за 0,000002 или 0,000001 выполнится работа."
это смотря массивы какой величины сортируются
если такое различие, то, конечно, без разницы
вообще, в любой книге по теории алгоритмов показывается, что это заблуждение, что с возрастанием мощности компов ценность эффектинвых алгоритмов падает
насколько мне известно, пузырь эффективнее квиксорта когда массив почти упорядоченный
если памяти не жалко, то сортировка подсчётом рулит куче всех


 
TUser ©   (2005-11-14 22:24) [14]

Если маленький массив - пузырьком. Большой - квиком. В особых случаях буду думать.


 
default ©   (2005-11-14 22:27) [15]

смотря, конечно, какие единицы измерения у 0,000002 или 0,000001 :)


 
partizan   (2005-11-15 02:26) [16]

Heapsort рулит!
А если надо список а не массив сортировать, то сортировка слиянием


 
Германн ©   (2005-11-15 03:14) [17]

Всё классно рулит! Но с учётом "препод выдал мне задание на сортировку(по возрастанию или убыванию в зависимости от параметра) массива памяти в AVR AT90" возникают проблемы. Стэк там весьма ограничен.


 
wicked ©   (2005-11-15 03:40) [18]


> Если нужно быстро написать код для сортировки одномерного
> массива, не используя дополнительные библиотеки и литературу,
>  каким методом вы воспользуетесь скорее всего?

пузырь.... знаю, что неэффективно, но ничего другого не помню.... :(

если есть доступ к литературе, то буду использовать то, что там найду.... ;)
постараюсь найти либо quick sort, либо версии, базирующиеся на нем....

если библиотеки в счет, то
1) sort (#include <algorithm.h>) - если пишу на си++
2) qsort (#include <stdlib.h>) - если пишу на простом си
3) TStringList.Sort, TList.Sort - если доступен vcl
4) что попадется.... ;)


 
Sha ©   (2005-11-15 12:24) [19]

Оптимизированная QuickSort,
стандартная HeapSort.


 
Булат Шакиров ©   (2005-11-15 13:04) [20]

Если нужно быстро написать, то через нахождение макс. (мин.) элемента и перестановку. Не в курсе, как это называется. Сам придумал ;)


 
Marser ©   (2005-11-15 15:47) [21]

Не понимаю влюбленности большинства в "пузырёк". Мне он почему-то не кажется самым естественным. Метод выбора, ИМХО, как раз такой.


 
Marser ©   (2005-11-15 15:53) [22]

Кстати, ещё выяснилось, что многие неправльно понимають, что есть "пузырёк". Например, моя сестра как раз назвала метод выбора методом "пузырька". Но алголист и Бакнелл на моей стороне :-)


 
Marser ©   (2005-11-15 15:53) [23]

Кстати, ещё выяснилось, что многие неправльно понимають, что есть "пузырёк". Например, моя сестра как раз назвала метод выбора методом "пузырька". Но алголист и Бакнелл на моей стороне :-)


 
jack128 ©   (2005-11-15 15:58) [24]

Marser ©   (15.11.05 15:53) [22]
Например, моя сестра как раз назвала метод выбора методом "пузырька".


А где в "выборе" элемент массива всплывает? Он там телепортируется в нужное место ;)


 
Marser ©   (2005-11-15 16:01) [25]

И Кнут тоже. Сегодня в книжном магазине пролистал третий том :-)

З.Ы. Извиняюсь за дубли....


 
Sha ©   (2005-11-15 16:12) [26]

Любителям пузырька, выбора и т.п. O(N^2) алгоритмов сортировки посвящается.

Разница в скорости работы этих алгоритмов и нормальных O(N logN)
алгоритмов на больших массивах не в разы, как думают некоторые.

Разница такова: один не завершится при вашей жизни, а другой сортирует :)


 
Marser ©   (2005-11-15 16:20) [27]


> Любителям пузырька, выбора и т.п. O(N^2) алгоритмов сортировки
> посвящается.
>
> Разница в скорости работы этих алгоритмов и нормальных O(N
> logN)
> алгоритмов на больших массивах не в разы, как думают некоторые.
>
>
> Разница такова: один не завершится при вашей жизни, а другой
> сортирует :)


Знаю, Бакнелла читал :-)
Хотя до твоего уровня пониманию алгоритмов оочень далеко...


 
pasha_golub ©   (2005-11-15 16:23) [28]


> Sha ©   (15.11.05 16:12) [26]


> на больших массивах не в разы

Большой это сколько? И соответственно чего сортируем? И на какой машине?

Я не вредный, просто не попадалось мне в жизни настолько больших массивов, где бы квадратичная сложность алгоритма была неприемлема.


 
Sandman29 ©   (2005-11-15 16:29) [29]

Sha ©   (15.11.05 16:12) [26]

O(NlogN)=5 минут
O(N^2)=5 лет=5*60*24*365=2628000 минут
Имеем:
N^2/(NlogN)=2628000/5
N/logN=525600
N=525600logN
N>5000000

При всем желании для таких размерностей уже не поленишься QuickSort написать.
А для меньших вполне пузырек сойдет :)


 
Marser ©   (2005-11-15 16:39) [30]


> O(N^2)

(N^2)/2 для выбора, если быть точным.


 
Sha ©   (2005-11-15 17:09) [31]

> Marser ©   (15.11.05 16:39) [30]
Знак "O" поглощает любой постоянный множитель.


 
Sha ©   (2005-11-15 17:15) [32]

> pasha_golub ©   (15.11.05 16:23) [28]
2 примера:
Построение индекса в online БД.
Выдача отсортированного оглавления www-сервером.


 
pasha_golub ©   (2005-11-15 17:41) [33]


> Sha ©   (15.11.05 17:15) [32]

Я на триста процентов согласен, что бывают такие ситуации... Но и online БД может состоять из трех записей. ;0)



Страницы: 1 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.047 c
3-1129634534
СергейГР
2005-10-18 15:22
2005.12.04
_небольшая_ база данных


2-1132160196
Era
2005-11-16 19:56
2005.12.04
Сервисы


6-1124950549
yasny
2005-08-25 10:15
2005.12.04
TIdSMTP получение поддтверждения о доставке


14-1131734081
ArtemESC
2005-11-11 21:34
2005.12.04
Chdisk в WinXP


2-1131884704
Erick
2005-11-13 15:25
2005.12.04
Подбор пароля по двум символам