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

Вниз

Сортировка Шелла   Найти похожие ветки 

 
Dismember ©   (2007-04-07 07:48) [0]

В общем, задача такая. Есть некоторый массив из n элементов , в котором нужно найти k наибольших элементов, используя сортировку Шелла. Но главная задача - сократить количество сравнения и пересылок, то есть массив не должен быть полностью упорядочен. Предложите какой-нибудь алгоритм :)


 
jup   (2007-04-07 07:56) [1]

Может так:
отсортировать массив любом способом а потом просто взять k последних элементов? Или обязательно использовать сортировку Шелла?


 
SerJaNT ©   (2007-04-07 07:59) [2]

procedure sort_shell (var a:array of word);
var
 bis,i,j,k:longint;
 h:word;
begin
 bis:=high(a);
 k:=bis shr 1;
 While k>0 do
 Begin
   For i:=0 To bis-k do
   begin
     j:=i;
     While (j>=0) And  (a[j]>a[j+k]) do
     begin
       h:=a[j];
       a[j]:=a[j+k];
       a[j+k]:=h;
       dec(j,k);
     end;
   end;
   k:=k shr 1;
 End;
End;


 
Dismember ©   (2007-04-07 08:34) [3]

Вся проблема в том, что массив полностью сортировать не нужно. Я понимаю, что проще сначала отсортировать массив, а потом взять последние k элементов, но тот, кому я пытаюсь сдать эту чертову задачу, утверждает, что можно каким-то образом без полной сортировки массива найти в нем максимальные элементы.


 
palva ©   (2007-04-07 09:18) [4]

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

Конечно можно. Но у вас ведь условие, использовать сортировку Шелла. Ну используйте ее тогда на каком-нибудь подмассиве из одного элемента - это ничему не помешает, а потом делайте задачу k-кратным поиском максимального элемента и перемещением его в низ массива.


 
MBo ©   (2007-04-07 09:58) [5]

Для частичной сортировки массива гораздо лучше использовать модифицированный QuickSort. В STL C++ включен partialsort, основанный как раз на этом.
На мой взгляд, сортировка Шелла несколько хуже подходит для этой задачи, поскольку она сортирует группы элементов с уменьшающимся шагом, быстро выбирая наибольшие элементы в группах, однако при этом не гарантируя, что в какой-то группе нужные большие элементы не будут близки к началу (на шаге 3 демонстрации http://algolist.manual.ru/sort/shell_sort.php большой элемент 10 стоит близко к началу). Полагаю, что можно применить метод, аналогичный выбору медианы за линейное время (с группами по 5 элементов), или задаче с выбором лучших беговых котов по результатам небольшого количества забегов (из пятничных задач), однако это достаточно сложно и не слишком эффективно, в отличие от PartialQuickSort (сложность O(N+kLogk))

>SerJaNT ©   (07.04.07 07:59) [2]
это не слишком удачная реализация. Уменьшение шага вдвое было как раз изначально и предложено Шеллом, однако при этом, скажем, четные и нечетные элементы не сравниваются друг с другом до последнего прохода, что приводи к квадратичному поведению в худжем случае. Лучше использовать взаимно простые попарно числа, хотя бы из ряда 2^k -1 (1,3,7...)



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

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

Наверх




Память: 0.48 MB
Время: 0.029 c
2-1176526279
NewPlayer
2007-04-14 08:51
2007.05.06
почему не уничтожается обьект


15-1175881648
ArtemESC
2007-04-06 21:47
2007.05.06
Нужна прога...


2-1176634478
Nija
2007-04-15 14:54
2007.05.06
Тупой вопрос


8-1156316216
Dewian
2006-08-23 10:56
2007.05.06
Визуальные образы в Вмнампе


15-1175973230
McSimm
2007-04-07 23:13
2007.05.06
новости Fast Reports - FastReport 4.02 c поддержкой Delphi 2007