Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 29.06.2016
Сообщений: 110
1

Сортировка слиянием с использованием std::vector

01.03.2019, 14:09. Показов 4996. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, у меня есть алгоритм сортировки слиянием, который формирует массив, используя vector. Я мало знаком с vector в C++, и не очень понимаю один момент. Вот код:
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
#include <iostream>
#include <vector>
using namespace std;    
 
int amount = 0;
template<typename Type>
static void merge(vector<Type>& buf, size_t left, size_t right, size_t middle) //слияние
{
    if (left >= right || middle < left || middle > right) return;
    if (right == left + 1 && buf[left] > buf[right]) {
        swap(buf[left], buf[right]);
        amount++;
        return;
    }
 
    vector<Type> tmp(&buf[left], &buf[right] + 1);
 
    for (size_t i = left, j = 0, k = middle - left + 1; i <= right; ++i) {
        if (j > middle - left) {
            buf[i] = tmp[k++];
        }
        else if (k > right - left) {
            buf[i] = tmp[j++];
        }
        else {
            buf[i] = (tmp[j] < tmp[k]) ? tmp[j++] : tmp[k++];
        }
    }
}
 
template<typename Type>
void MergeSort(vector<Type>& buf, size_t left, size_t right) //сортировка
{
    if (left >= right) return;
 
    size_t middle = left + (right - left) / 2;
 
    MergeSort(buf, left, middle);
    MergeSort(buf, middle + 1, right);
    merge(buf, left, right, middle);
}
 
 
 
int main()
{
    setlocale(LC_ALL, "Rus");
 
    int n = 0;
 
    cout << "Размер массива > ";
    cin >> n;
 
    vector<int> A(n);
 
    for (int i = 0; i < n; i++)
        cin >> A[i];
 
    MergeSort(A, 0, n - 1);
 
    cout << "Упорядоченный массив: ";
    for (int i = 0; i < n; i++)
        cout << A[i] << " ";
 
    cout << "\namount = " << amount << "\n";
 
    system("pause");
    return 0;
}
Подскажите, пожалуйста, что делает строка №16? И можно ли переделать этот код, используя обычные динамические массивы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2019, 14:09
Ответы с готовыми решениями:

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор....

Сортировка std::vector
Есть у меня два вектора одинакового размера, например: 1) {3, 5, 0, 6} 2) {9, 7, 1, 4} На выходе...

Сортировка по одному из полей std::vector
Подскажите пожалуйста! Задача: Имеется класс Person с полями: Family, Name, BirthDay, Sex,...

5
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.03.2019, 14:11 2
Цитата Сообщение от Fossil121 Посмотреть сообщение
Вот код:
Цитата Сообщение от Fossil121 Посмотреть сообщение
Подскажите, пожалуйста, что делает строка №16?
Исходя из этого стоит понимать что код не ваш?
Цитата Сообщение от Fossil121 Посмотреть сообщение
И можно ли переделать этот код, используя обычные динамические массивы?
Можно.
0
0 / 0 / 1
Регистрация: 29.06.2016
Сообщений: 110
01.03.2019, 14:29  [ТС] 3
Azazel-San, не мой, алгоритм из Википедии, я просто хочу разобраться, не подскажете? Правильно ли я понимаю, что в строке 16 формируется массив, в который помещаются элементы из массива buf, начиная с элемента [left] до элемента [right+1]?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.03.2019, 14:48 4
Цитата Сообщение от Fossil121 Посмотреть сообщение
Правильно ли я понимаю, что в строке 16 формируется массив, в который помещаются элементы из массива buf, начиная с элемента [left] до элемента [right+1]?
Да, можна и так сказать.
1
0 / 0 / 1
Регистрация: 29.06.2016
Сообщений: 110
01.03.2019, 14:55  [ТС] 5
Azazel-San, спасибо, но более точное определение не подскажете? или хотя бы где почитать про это?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.03.2019, 15:11 6
Цитата Сообщение от Fossil121 Посмотреть сообщение
но более точное определение не подскажете?
Цитата Сообщение от Azazel-San Посмотреть сообщение
что в строке 16 формируется массив,
типа Type
Цитата Сообщение от Azazel-San Посмотреть сообщение
в который помещаются элементы из массива buf, начиная с элемента [left] до элемента [right+1]
Цитата Сообщение от Fossil121 Посмотреть сообщение
или хотя бы где почитать про это?
https://en.cppreference.com/w/... tor/vector
https://en.cppreference.com/w/... /templates
1
01.03.2019, 15:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2019, 15:11
Помогаю со студенческими работами здесь

Как изменять размер std::vector<std::vector>?
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: ...

Вывести значения std::vector<std::vector<int*> >
Подскажите, как вывести значения? const size_t row = 3; const size_t col = 3;...

Сортировка строк двумерного std::vector'а в лексикографическом порядке
Позвольте узнать... Возможно ли через vector&lt;vector&lt;double&gt;&gt; и функцию std::sort() отсортировать...

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator>
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я...


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

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