Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.039 c
2-1176817310
Gentos
2007-04-17 17:41
2007.05.06
DBImage1: TDBImage; - с какой компонентой проще всего работать ?


1-1173269911
ElectriC
2007-03-07 15:18
2007.05.06
Обработка ошибок(Исключений)


15-1175764676
Ricks
2007-04-05 13:17
2007.05.06
Редактор значков (ico)


2-1176528655
Гость у мастеров
2007-04-14 09:30
2007.05.06
ActiveX. начало


15-1175693490
vasIZmax
2007-04-04 17:31
2007.05.06
Может кто-нибудь что-нибудь подскажет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский