Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.017 c
1-1173267760
DmitrichJ
2007-03-07 14:42
2007.05.06
Генератор в MSSQL. Бьюсь уже 2-а дня.


2-1176534590
vegarulez
2007-04-14 11:09
2007.05.06
Как правильно "растянуть" рисунок на кнопке?


8-1155671586
Denisich
2006-08-15 23:53
2007.05.06
DSPack


3-1171740637
maxfiles
2007-02-17 22:30
2007.05.06
про 1c 7.7


2-1176584879
Ezorcist
2007-04-15 01:07
2007.05.06
Как правильно вести лог событий работы программы?




   Наверх