С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 20.10.2009
Сообщений: 11

Шаблон класса для блочной сортировки

09.11.2009, 20:13. Показов 2315. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задание реализовать шаблон класса, содержащий разные методы сортировок. Тип сортируемых элементов передаётся как параметр. В общем-то, всё получается, кроме блочной сортровки (http://ru.wikipedia.org/wiki/Блочная_сортировка). Насколько я понял, для неё вообще не получится реализовать шаблон по причине того, что "Данный алгоритм требует знаний о природе сортируемых данных, выходящих за рамки функций "сравнить" и "поменять местами", достаточных для сортировки слиянием, сортировки пирамидой, быстрой сортировки, сортировки Шелла, сортировки вставкой."
Если я неправильно думаю, помогайте, пожалуйста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.11.2009, 20:13
Ответы с готовыми решениями:

Создать шаблон класса массив с методом сортировки
Задание:Создать шаблон класса массив с методом сортировки, отсортировать свой класс “Адрес” по его полям город, улица, индекс. Есть...

Создать шаблон класса массив с методом сортировки
Задание:Создать шаблон класса массив с методом сортировки, отсортировать свой класс “Адрес” по его полям город, улица, индекс. Есть...

Реализация блочной сортировки файла
Здравствуйте! Есть задача,как следствие ее нужно решить)) Я прекрасно знаю и понимаю,что никто за меня решать здесь не собирается.Но...

4
23 / 23 / 3
Регистрация: 20.02.2009
Сообщений: 59
09.11.2009, 22:27
Допустим нет ничего невозможно .

Хоть бы привёл для интереса сигнатуру шаблона, было бы проще думать как что-нибудь встроить.
Я бы такую задачу решал следующим образом:
Вторым параметром шаблона ввёл класс, который сможет определить размер корзины или нормальным языком - максимальное расстояние между соседними элементами.
Тогда изначально кол-во корзин - 0. Вставляем первый элемент - заводим первую корзину, как начало отсчёта. Вставляем второй и последующие элементы - рассчитываем расстояние относительно первого и заводим (если надо) новую корзину, или используем существующую (созданную ранее). Тогда после всех вставок получим какой-то набор корзин. Причём если попробовать этот набор организовать на основании списка, то по памяти будет очень хорошо. Ну а дальше действия как описаны на приводимом сайте.

Например (пишу без проверок, но идея должна быть ясна):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
template<class T>
struct Basket
{
    std::list<T> m_listElements;
    long m_lDistance;
    Basket(long lDistance)
       : m_lDistance(lDistance)
    {  }
};
template<class T, class LengthTraits = LengthTraitsTmpl<T> >
struct A
{
    T m_vFirst; // Начало отсчёта
    std::list<Basket> listBaskets; /* список корзин. списков можно завести 2 - в зависимости от знака
                                                смещения от начала отсчёта. А можно просто при каждой вставке 
                                                (если нужно) перемещать начало отсчёта таким образом, 
                                                чтобы все смещения были положительные */
   void insert(const T& v)
   {
       long lDistance = LengthTraits::GetDistance(m_vFirst, v);
       for(std::list<Basket>::iterator it = listBaskets.begin(); it != listBaskets.end(); ++it)
       {
            if(it->m_lDistance == lDistance)
            {
                it->m_listElements.push_back(v);
                break;
            }
            if(it->m_lDistance > lDistance)
            {
                // Заводим новую корзину
                Basket basket(lDistance);
                basket.push_back(v);
                listBaskets.insert_before(it, basket);
                break;
            }
       }
   }
};
 
template<class T>
struct LengthTraitsTmpl
{
     long GetDistance(const T& f, const T& v);
};
 
// Теперь пишем специализации для необходимых типов:
 
// для целого
template<>
struct LengthTraitsTmpl<int>
{
     static long GetDistance(const int& f, const int& v)
     {
          return (v - f) / 10; // Например по 10 элементов в корзине
     }
};
 
// для строки
template<>
struct LengthTraitsTmpl<std::string>
{
     static long GetDistance(const std::string& f, const std::string& v)
     {
          // строки можно попробовать распихать по корзинам в виде алфавита
          // это только пример, потому что здесь необходимо вывести формулу
          // для номера корзины в зависимости от индекса символа в строке.
          return v[0] - f[0];
     }
};
 ну и так далее...
2
0 / 0 / 0
Регистрация: 20.10.2009
Сообщений: 11
10.11.2009, 22:33  [ТС]
Идею вроде понял, нужно более детально разобраться. Спасибо большое за помощь!
0
0 / 0 / 0
Регистрация: 20.10.2009
Сообщений: 11
13.11.2009, 19:28  [ТС]
а что вот это означает:
C
1
2
 Basket(long lDistance)
       : m_lDistance(lDistance)
?
0
23 / 23 / 3
Регистрация: 20.02.2009
Сообщений: 59
13.11.2009, 19:43
Цитата Сообщение от dware Посмотреть сообщение
а что вот это означает:
C
1
2
 Basket(long lDistance)
       : m_lDistance(lDistance)
?
Конструктор класс Basket, при вызове конструктора член класса m_lDistance будет инициализирован переданным значением.
Сделано изходя из предположения, что объект класса Basket должен всегда быть инициализирован значением расстояния от центра расчётов.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2009, 19:43
Помогаю со студенческими работами здесь

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают) Троллейбус и Трамвай одинаковые поля...

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

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

Рабочий шаблон блочной верстки
Есть код из двух частей 1 &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; ...

Реализация карманной (блочной) сортировки
Пытаюсь реализовать на C# карманную сортировку. Суть алгоритма в том, чтобы разложить входной масив из N елементов в N карманов на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru