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

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

31.05.2017, 16:04. Показов 10037. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Даны два массива. Массив А состоит из N элементов и отсортирован по возрастанию. Массив B состоит из M элементов и отсортирован по убыванию. Разработать программу для слияния этих массивов в отсортированный по убыванию массив 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
70
71
72
73
74
75
76
77
#include <iostream>
#include <math.h>
 
using namespace std;
 
int main() {
    setlocale(LC_ALL, "russian");
    
    int n, c=20 ,b, temp, tempC = 0;
    
    int masivA[10], masivB[10], masivC[20];
 
    cout << "Введите количество элементов массива A: ";
    cin >> n;
 
    for (int i = 0; i < n; i++) {
        cout << "Введите число " << i << ": ";
        cin >> masivA[i];
    }
 
    //сортировка пузырьком
 
    for (int i = 1; i < n; ++i)
    {
        for (int r = 0; r < n - i; r++)
        {
            if (masivA[r] > masivA[r + 1])
            {
                // Обмен местами
                int temp = masivA[r];
                masivA[r] = masivA[r + 1];
                masivA[r + 1] = temp;
            }
        }
    }
 
 
    //вывод
 
    for (int i = 0; i < n; i++) {
        cout << masivA[i] << " ";
    }
    cout << endl;
 
    //***************************************************************************\\
 
    cout << "Введите количество элементов массива B: ";
    cin >> b;
 
    for (int i = 0; i < b; i++) {
        cout << "Введите число " << i << ": ";
        cin >> masivB[i];
    }
 
    //сортировка пузырьком
 
    for (int i = 1; i < b; ++i)
    {
        for (int r = 0; r < b - i; r++)
        {
            if (masivB[r] < masivB[r + 1])
            {
                // Обмен местами
                int temp = masivB[r];
                masivB[r] = masivB[r + 1];
                masivB[r + 1] = temp;
            }
        }
    }
 
 
    for (int i = 0; i < b; i++) {
        cout << masivB[i] << " ";
    }
    cout << endl;
 
system("pause");
Но как их слить, еще и отсортировать, да и к тому же без повторных элементов я не представляю...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.05.2017, 16:04
Ответы с готовыми решениями:

Объединить два массива в третий массив, отсортированный по убыванию
Помогите пожалуйста закончить. В общем есть два массива, один отсортирован по возрастанию, второй по убыванию. Нужно объеденить эти два...

Слить два массива в третий
Добрый день! Помогите написать часть программы на встроенном asm,а именно произвести слияние двух массивов в третий(т.е. по коду это str...

Слить два упорядоченных массива в третий
помогите чутка,надо слить два массива в один и упорядочить,создал два упорядоченых массива а как ввести их значения в 3ий не пойму#include...

13
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
31.05.2017, 16:49
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
using namespace std;
 
int main()
{
    int a[4] = {7, 5, 16, 8};
    int b[5] = {7, 5, 16, 8 ,1};
    vector<int> A (a, a + sizeof(a) / sizeof(a[0]));
    vector<int> B (b, b + sizeof(b) / sizeof(b[0]));
    vector<int> AB;
    AB.reserve( A.size() + B.size() ); // preallocate memory
    AB.insert( AB.end(), A.begin(), A.end() );
    AB.insert( AB.end(), B.begin(), B.end() );
    sort(AB.begin(),AB.end());
    reverse(AB.begin(), AB.end()); 
    AB.erase( unique( AB.begin(), AB.end() ), AB.end() );
    copy(AB.begin(), AB.end(),  ostream_iterator<int>( cout, " "));
    cout<<endl;
    system("pause");
    return 0;
}
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
31.05.2017, 17:47
igorbukur, здравствуйте! Использовал математическую теорию множеств для решения данной задачи. Вот код:

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
#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>
#include <vector>
#include <windows.h> //Шрифт консоли - Lucida Console
 
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int N, M;
    set<int> X;
    set<int> Y;
    set<int> Z;
    vector<int> C;
    cout << "Введите размерность первого массива:" << endl;
    cout << "N = ";
    cin >> N;
    cout << "Введите размерность второго массива:" << endl;
    cout << "M = ";
    cin >> M;
    int* A = new int[N]; //Объявляем первый массив динамически
    int* B = new int[M]; //Объявляем второй массив динамически
    cout << "Первый массив:" << endl;
    for (int i = 0; i < N; i++)
    {
        cin >> A[i]; //Вводим элементы первого массива
        X.insert(A[i]); //Помещаем элементы первого массива в множество X
    }
    cout << "Второй массив:" << endl;
    for (int i = 0; i < M; i++)
    {
        cin >> B[i]; //Вводим элементы второго массива
        Y.insert(B[i]); //Помещаем элементы второго массива в множество Y
    }
    set_union(X.begin(), X.end(), Y.begin(), Y.end(), inserter(Z, Z.begin())); //Объединение множеств
    C.assign(Z.begin(), Z.end()); //Помещаем множество в вектор 
    sort(C.begin(), C.end(), greater<int>());
    cout << "Массив после слияния, отсортированный по убыванию:" << endl;
    for (int i = 0; i < C.size(); i++)
    {
        cout << C[i] << " ";
    }
    cout << endl;
    delete [] A; //Удаляем из памяти первый массив
    delete [] B; //Удаляем из памяти второй массив
    system("pause");
    return 0;
}
0
0 / 0 / 1
Регистрация: 02.02.2016
Сообщений: 128
31.05.2017, 17:52  [ТС]
А как быть если не использовать библиотеку vector-ов? (ибо мы как бы ее так скажем не трогали..
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
31.05.2017, 18:34
igorbukur, Я не знаю есть ли возможность поместить элементы результирующего множества в массив. В вектор, как видите, можно. Также, можно сократить этот код и просто отсортировать множество по убыванию (оно после объединения отсортировано по возрастанию). Вас устроит такой вариант? Или вам чисто для массивов код нужен?

Добавлено через 7 минут
igorbukur, я не дождался вашего ответа и сделал программу только с применением массивов. Вот код:

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
#include <iostream>
#include <algorithm>
#include <windows.h> //Шрифт консоли - Lucida Console
 
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int N, M;
    cout << "Введите размерность первого массива:" << endl;
    cout << "N = ";
    cin >> N;
    cout << "Введите размерность второго массива:" << endl;
    cout << "M = ";
    cin >> M;
    int* A = new int[N]; //Объявляем первый массив динамически
    int* B = new int[M]; //Объявляем второй массив динамически
    int* C = new int[N+M]; //Объявляем третий массив динамически
    cout << "Первый массив:" << endl;
    for (int i = 0; i < N; i++)
    {
        cin >> A[i]; //Вводим элементы первого массива
        C[i] = A[i]; //Помещаем элементы массива A в массив С
    }
    cout << "Второй массив:" << endl;
    for (int i = 0; i < M; i++)
    {
        cin >> B[i]; //Вводим элементы второго массива
        C[N+i] = B[i]; //Помещаем элементы массива B в массив С
    }
    sort(C, C + N + M, greater<int>()); //Сортируем массив C по убыванию
    cout << "Массив после слияния, отсортированный по убыванию:" << endl;
    for (int i = 0; i < N + M; i++)
    {
        if (C[i] != C[i+1])
        {
            cout << C[i] << " "; //Выводим массив C без повторов
        }
    }
    cout << endl;
    delete [] A; //Удаляем из памяти первый массив
    delete [] B; //Удаляем из памяти второй массив
    delete [] C; //Удаляем из памяти третий массив
    system("pause");
    return 0;
}
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
31.05.2017, 19:01
Fixer_84, мне кажется вы не решили поставленной задачи, массив С не должен содержать повторяющихся элементов
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
31.05.2017, 19:46
afront, спасибо за ваше замечание. Да, вы правы. Но я вывел его без повторов, а значит эти числа можно легко записать в другой массив

Добавлено через 9 минут
afront, на всякий случай, выкладываю вариант с вашей поправкой:

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
#include <iostream>
#include <algorithm>
#include <windows.h> //Шрифт консоли - Lucida Console
 
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int N, M, k;
    cout << "Введите размерность первого массива:" << endl;
    cout << "N = ";
    cin >> N;
    cout << "Введите размерность второго массива:" << endl;
    cout << "M = ";
    cin >> M;
    int* A = new int[N]; //Объявляем первый массив динамически
    int* B = new int[M]; //Объявляем второй массив динамически
    int* C = new int[N+M]; //Объявляем третий массив динамически
    cout << "Первый массив:" << endl;
    for (int i = 0; i < N; i++)
    {
        cin >> A[i]; //Вводим элементы первого массива
        C[i] = A[i]; //Помещаем элементы массива A в массив С
    }
    cout << "Второй массив:" << endl;
    for (int i = 0; i < M; i++)
    {
        cin >> B[i]; //Вводим элементы второго массива
        C[N+i] = B[i]; //Помещаем элементы массива B в массив С
    }
    sort(C, C + N + M, greater<int>()); //Сортируем массив C по убыванию
    k = 0;
    for (int i = 0; i < N + M; i++)
    {
        if (C[i] != C[i+1])
        {
            C[k++] = C[i];
        }
    }
    cout << "Массив после слияния, отсортированный по убыванию:" << endl;
    for (int i = 0; i < k; i++)
    {
    cout << C[i] << " ";
    }
    cout << endl;
    delete [] A; //Удаляем из памяти первый массив
    delete [] B; //Удаляем из памяти второй массив
    delete [] C; //Удаляем из памяти третий массив
    system("pause");
    return 0;
}
0
0 / 0 / 1
Регистрация: 02.02.2016
Сообщений: 128
31.05.2017, 20:36  [ТС]
Компилятор жалуется на строку 33: sort(C, C + N + M, greater<int>()); //Сортируем массив C по убыванию.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
31.05.2017, 21:10
igorbukur, у вас библиотека #include <algorithm> подключена? Если нет, то подключите. Это встроенная функция сортировки, но вы можете использовать любую другую. Например, сортировку методом Пузырька как в вашем коде выше. Будьте внимательны размерность массива не N или M, а N + M. Если не справитесь без меня, я скину код метода Пузырька. Кажется, для вас ничего сложного тут быть не должно.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
01.06.2017, 12:58
Цитата Сообщение от Fixer_84 Посмотреть сообщение
у вас библиотека #include <algorithm> подключена?
Только это не библиотека, а заголовочный файл.

Добавлено через 55 секунд
И шаблон greater<> определён в <functional>
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
01.06.2017, 13:57
MrGluck, здравствуйте! Спасибо за ваше замечание. У меня в DevCpp через <algorithm> срабатывает. Буду, если что, знать без чего может не срабатывать. Спасибо!
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
01.06.2017, 14:12
Fixer_84, топаем к первоисточникам, там все расписано.
http://www.cplusplus.com/refer... l/greater/
0
0 / 0 / 1
Регистрация: 02.02.2016
Сообщений: 128
28.06.2017, 23:11  [ТС]
А как отсортировать вашим методом масив C по возрастанию?
0
 Аватар для Zazy
47 / 47 / 23
Регистрация: 14.04.2013
Сообщений: 188
29.06.2017, 10:35
Цитата Сообщение от Fixer_84 Посмотреть сообщение
C++
1
2
3
4
5
6
7
for (int i = 0; i < N + M; i++)
* * {
* * * * if (C[i] != C[i+1])
* * * * {
* * * * * * C[k++] = C[i];
* * * * }
* * }
Допустим N + M = 10, т.е. размер выходного массива 10 элементов => последний элемент 9 => C[i+1] (C[9+1]) ???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2017, 10:35
Помогаю со студенческими работами здесь

Даны два упорядоченных массива. Слить их в третий, но чтобы элементы не повторялись
Даны два упорядоченных массива. Нужно слить их в третий, но чтобы элементы не повторялись. (один проход по массивам)

"Слить" два массива в третий, меняя элементы первого и второго
Дано два одинаковых по длине одномерных массива. &quot;Слить&quot; их в третий новый массив, меняя элементы первого и второго массивов.

Два упорядоченных по убыванию массива записать в третий
Ввести два упорядоченных по убыванию массива. С помощью функции занести их в третий, упорядоченный по возрастанию. Сортировки не...

Слить два лексикографически упорядоченных файла в третий
:'(Примечание. Решение задачи должно быть выполнено как оконное приложение Delphi. Предусмотреть диалог для открытия входных и выходных...

Сформировать из массива М новый отсортированный по убыванию массив
Нужно решить следующее: 1) Сформировать одномерный массив М(25), значения элементов которого представляют собой значения периода...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru