Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
1

Сортировка списка

17.11.2018, 13:14. Показов 2413. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть список list<Student> g (содержит n-ое количество экземпляров класса). Нужно сделать отдельную функцию которая принимает этот список и сортирует ( у класса есть поле growth ) по убыванию роста методом слияния. Для обычных массивов я понял как сортировку слиянием делать, но со списками вообще не понимаю как реализовать. Вроде нужно сделать собственный список, но я не понимаю как там узлы устанавливать хвост голова и т п. Буду благодарен если напишите код пример, или хорошую книгу где это разьясняется именно это.

C++
1
2
3
4
5
6
7
8
9
class Student
{
 
private:
 
    int gender;         // Пол ученика
    string fio;         // Фамилия ученика
    double mass;       // Масса ученика
    double growth;    // Рост ученика
Добавлено через 34 минуты
........

Добавлено через 1 час 37 минут
/////////////////////
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2018, 13:14
Ответы с готовыми решениями:

"Сортировка двусвязного списка путем исключения элемента с минимальным значением и включения его в начало нового списка
Здравствуйте! Возникла проблема с программой. Тема: &quot;Сортировка двусвязного списка путем исключения...

Сортировка списка
Приветствую всех! Есть небольшая проблема: не могу понять, как создать сортировку в алфавитном...

Сортировка списка
Нужно отсортировать списком класс Flight. class Flight { public: char flight_ID; ...

Сортировка списка
Во время проведения олимпиады каждый из участников получил свой идентификационный номер –...

12
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
17.11.2018, 13:49 2
Цитата Сообщение от cherc Посмотреть сообщение
Для обычных массивов я понял
Напишите для обычных массивов, а потом тип замените на Student.
А в условии вместо x<y напишите x.growth<y.growth

з.ы. не забудьте в классе определить копиконструктор и operator=
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
17.11.2018, 13:53 3
Цитата Сообщение от cherc Посмотреть сообщение
Вроде нужно сделать собственный список, но я не понимаю как там узлы устанавливать хвост голова и т п
вот этим и занимайся, при чём тут std::list то?
Задачка явно учебная на знание структур данных, а не библиотек языка!
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
17.11.2018, 13:55  [ТС] 4
zss,
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
#define maxn 100
 
int a[maxn];
 
int n;
 
void merge(int l, int r) {
    if (r == l)
        return;
    if (r - l == 1) { 
        if (a[r] < a[l])
            swap(a[r], a[l]);
        return;
    }
    int m = (r + l) / 2;
    merge(l, m);
    merge(m + 1, r);
    int buf[maxn];
    int xl = l;
    int xr = m + 1;
    int cur = 0;
    while (r - l + 1 != cur) {
        if (xl > m)
            buf[cur++] = a[xr++];
        else if (xr > r)
            buf[cur++] = a[xl++];
        else if (a[xl] > a[xr])
            buf[cur++] = a[xr++];
        else buf[cur++] = a[xl++];
 
    }
    for (int i = 0; i < cur; i++)
        a[i + l] = buf[i];
}
 
int main() {    
    cin >> n;
 
    for (int i = 0; i < n; i++)
        cin >> a[i];
 
    merge(0, n - 1);
 
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
 
    getch();
    return 0;
}
вот этот код подойдет чтоб под список сделать?

Добавлено через 1 минуту
Kuzia domovenok, Последнее предложение прочитай еще раз по слогам
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
17.11.2018, 13:56 5
cherc, я повторяю, задача эта для учёбы, а не для практической сортировки в проектах с STL
Простым копипастингом ты не отделаешься.
Последнее предложение прочитал и именно поэтому негодую, зачем тут std::list и копипастинг каких-то алгоритмов.
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
17.11.2018, 13:59  [ТС] 6
Kuzia domovenok, 2 сортировки с помощью std::list я уже сделал и сдал, осталось еще 3 сортировки. Использовать std::list не запрещали. И вообще работа направлена именно на работу с std::list
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
17.11.2018, 14:07 7
Цитата Сообщение от cherc Посмотреть сообщение
int a[maxn];
C++
1
Student a[maxn];
Цитата Сообщение от cherc Посмотреть сообщение
if (a[r] < a[l])
C++
1
if (a[r].growth < a[l].growth)
Цитата Сообщение от cherc Посмотреть сообщение
int buf[maxn];
C++
1
Student buff[maxn];
Только у Вас не список получается, а простой одномерный массив
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
17.11.2018, 15:08  [ТС] 8
zss, не получается ничего. У списка list нет индексов поэтому ошибки везде
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
17.11.2018, 15:16 9
У Вас не список, а массив переменных типа Student
Цитата Сообщение от zss Посмотреть сообщение
Student a[maxn];
Если хотите list<Student>, то это делается совсем не так
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
#include <iostream>
#include <list>
#include <cstring>
using namespace std;
struct S
{
    char name[100];
    int n;
    bool operator<(S& b)
    {
        return n < b.n;
    }
};
 
int main()
{
    list<S> LL;
    for (int i = 0; i < 10; i++)
    {
        S t;
        cin>>t.name;
        cin>>t.n;
        LL.push_back(t);
    }
    LL.sort();
    for (auto t : LL)
        cout <<t.name<<' '<< t.n << endl;
    system("pause");
    return 0;
}
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
17.11.2018, 15:18  [ТС] 10
zss, Вот пузырьковая сортировка
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
#ifndef BUBBLESORT_H_INCLUDED
#define BUBBLESORT_H_INCLUDED
 
#include <iostream>
#include <list>
#include <iterator>
#include "student.h"
 
void BubbleSort(list<Student>&Gournal)  // Функция для сортировки по росту
{
    Student a;
                // a и b протсо пустые обьекты для хранения данных;
    Student b;
 
    for (int i = 0; i < (int)Gournal.size() - 1; i++) {
        auto it1 = Gournal.begin();
        auto it2 = std::next(it1);
 
            for (int j = 0; j < (int)Gournal.size() - 1 - i; j++)
        {
                a = *it1;
                b = *it2;
                if (a.GetGrowth() < b.GetGrowth())
                {
                    std::swap(*it1, *it2);
                }
            it1++;
            it2++;
        }
    }
}
Точно также надо слиянием сделать.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
17.11.2018, 15:37 11
Лучший ответ Сообщение было отмечено cherc как решение

Решение

cherc, вот накатал на коленке пример слияния. Тут всё СТЛем обмазано как вы любите. Очень даже лаконично вышло
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
#include <iostream>
#include <list>
#include <queue>
using namespace std;
void msort(list<int>& a)
{
    queue<list<int> > jobs;
    for (auto it : a)
        jobs.push(list<int>(1, it));
    while (jobs.size() != 1)
    {
        auto first = jobs.front();      jobs.pop();
        auto secont = jobs.front();     jobs.pop();
        first.merge(secont);
        jobs.push(first);
    }
    a= jobs.front();
}
int main()
{
    list<int> a = { 5, 3, 9, 1, 7, 8, 5, 2 };
    msort(a);
    for (auto it : a)
        cout << it << " ";
    system("pause");
    return 0;
}
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
17.11.2018, 15:45  [ТС] 12
Kuzia domovenok, Спасибо за помощь, да я бы рад сделать как полагается. Вот и писал скиньге книгу или ссылку на сайт где обьясняется как делать свои списки
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
17.11.2018, 15:52 13
Лучший ответ Сообщение было отмечено cherc как решение

Решение

вот ещё с ростом
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
#include <iostream>
#include <list>
#include <queue>
using namespace std;
class Student
{
    double growth;    // ничего лишнего
public:
    Student(double g) :growth(g) {};
    double getGrowth() const { return growth; }
};
void msort(list<Student>& a)
{
    queue<list<Student> > jobs;
    for (auto it : a)
        jobs.emplace(1, it);
    while (jobs.size() != 1)
    {
        auto first = jobs.front();      jobs.pop();
        auto secont = jobs.front();     jobs.pop();
        first.merge(secont, [](const auto& l, const auto& r) {return l.getGrowth() < r.getGrowth(); });
        jobs.push(first);
    }
    a= jobs.front();
}
int main()
{
    list<Student> a = { 5, 3, 9, 1, 7, 8, 5, 2 };
    msort(a);
    for (auto it : a)
        cout << it.getGrowth() << " ";
    system("pause");
    return 0;
}
1
17.11.2018, 15:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2018, 15:52
Помогаю со студенческими работами здесь

Сортировка списка
Здравствуйте, не совсем понимаю как должна быть реализована сортировка вставками в деке. Что...

Сортировка списка
Всем привет) Нужно реализовать сортировку списка, линейного однонаправленного. Написал, но...

Сортировка списка
помогите сделать сортировку по возрасту, а то ничего не выходит #include &lt;iostream&gt; #include...

Сортировка списка
Здравствуйте!!! Прошу помочь мне написать алгоритм сортировки односвязного списка. Задание такое:...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru