Форум программистов, компьютерный форум CyberForum.ru

Быстрая сортировка (сортировка Хоара) для связных списков - C++

Восстановить пароль Регистрация
 
Xoniks
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 31
19.06.2014, 13:04     Быстрая сортировка (сортировка Хоара) для связных списков #1
есть у кого готовый алгоритм? или подскажите как реализовать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2014, 13:04     Быстрая сортировка (сортировка Хоара) для связных списков
Посмотрите здесь:

C++ Сортировка двунаправленного линейного списка по алгоритму Хоара
Быстрая сортировка Хоара C++
C++ Быстрая сортировка Хоара без рекурсивных функций
C++ Сортировка Хоара
C++ Быстрая сортировка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
19.06.2014, 13:06     Быстрая сортировка (сортировка Хоара) для связных списков #2
Алгоритмы сортировок
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
19.06.2014, 13:17     Быстрая сортировка (сортировка Хоара) для связных списков #3
так же как и для массивов.
только там для разбиения данных на две части лучше не обменивать элементы в цикле, а формировать как бы два новых списка из элементов старых, потому что операции удаления/добавления (особенно в конец) для списков идут быстрее, чем операции обмена
Xoniks
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 31
19.06.2014, 16:58  [ТС]     Быстрая сортировка (сортировка Хоара) для связных списков #4
То есть, я беру например первый элемент списка, делаю его опорным, затем делю список на 2, и в одну сторону меньше опорного, в другую больше?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.06.2014, 02:27     Быстрая сортировка (сортировка Хоара) для связных списков #5
Это и есть оперделение "быстрой сортировки"! Я же говорю о том, что, применяя её к спискам, для разбиения на две половины нужно не переставлять элементы местами, а создавать "как-бэ два новых списка" путём добавления в них элементов из оригинала и далее уже сортировать их.
Как-то так.
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
struct ListItem
{
    int key;
    ListItem *next;
};
ListItem* Key_Push_Front(ListItem* Start, int newKey)
{
    ListItem* tNew = new ListItem;
    tNew->key = newKey;
    tNew->next = Start;
    return tNew;
}
inline ListItem* Node_Push_Front(ListItem* Start, ListItem* newNode)
{
    newNode->next = Start;
    return newNode;
}
void Print_List(ListItem* MyList)
{
    for (ListItem* it = MyList; it != NULL; it = it->next)
        std::cout << (it->key) << " ";
    std::cout << std::endl;
}
ListItem* Q_sort(ListItem* data, ListItem** endptr)
{
    *endptr = data;
    if (!data)      return NULL;
    if (!data->next) return data;
    ListItem* Right=NULL;
    ListItem* Left=NULL;
    ListItem* it = data;
    ListItem* tmp;
    int med = data->key;
    while (it)
    {
        tmp = it->next;
        if (it->key < med) 
            Right = Node_Push_Front(Right, it);
        else 
            Left  = Node_Push_Front(Left,  it);
        it = tmp;
    }
    Right=Q_sort(Right, &it);
    if (!Right)
        Right = Q_sort(Left, endptr);
    else        
        it->next = Q_sort(Left, endptr);
    return Right;
}
int main()
{
    ListItem* MyList = NULL;
    ListItem* it;
    srand(time(NULL));
    for (int i = 0; i < 10; ++i)
        MyList = Key_Push_Front(MyList, rand()%100);
    Print_List(MyList);
    MyList = Q_sort(MyList, &it);
    Print_List(MyList);
    return 0;
}
Xoniks
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 31
20.06.2014, 14:16  [ТС]     Быстрая сортировка (сортировка Хоара) для связных списков #6
хм.. считает далеко не все промежутки) но спасибо и на этом
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.06.2014, 15:29     Быстрая сортировка (сортировка Хоара) для связных списков #7
Что конкретно не так?
Xoniks
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 31
20.06.2014, 16:55  [ТС]     Быстрая сортировка (сортировка Хоара) для связных списков #8
ну попробуй поставить не 10 чисел, а 50 и сам поймешь
и можно как-нибудь сделать? чтобы в функцию сортировки, передавать только указатель на первый элемент списка
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.06.2014, 17:07     Быстрая сортировка (сортировка Хоара) для связных списков #9
Цитата Сообщение от Xoniks Посмотреть сообщение
и можно как-нибудь сделать? чтобы в функцию сортировки, передавать только указатель на первый элемент списка
А у меня что по-твоему передаётся?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2014, 17:09     Быстрая сортировка (сортировка Хоара) для связных списков
Еще ссылки по теме:

C++ Не работает быстрая сортировка для двумерного массива
C++ сортировка хоара
Сортировка методом "быстрая сортировка" C++

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

Или воспользуйтесь поиском по форуму:
Xoniks
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 31
20.06.2014, 17:09  [ТС]     Быстрая сортировка (сортировка Хоара) для связных списков #10
C++
1
ListItem* Q_sort(ListItem* data, ListItem** endptr)
endptr.. еще, а по идее можно без него обойтись, я бы хотел передавать в функцию, только один указатель, и больше ничего
Yandex
Объявления
20.06.2014, 17:09     Быстрая сортировка (сортировка Хоара) для связных списков
Ответ Создать тему
Опции темы

Текущее время: 04:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru