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

Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию

13.06.2013, 20:09. Показов 17232. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача такая, на форуме где то была уже. Но суть совсем другая.
Есть два упорядоченных массива одномерных массива А(N) и B(M). Соединить эти массивы в один С(N+M) упорядоченный массив. Массивы А и В могут быть упорядоченны в любой последовательности. Массив А (либо по возрастанию или по убыванию), точно так же и насчет массива В. А могу быть и упорядочены в одной последовательности.

Вот код который работает если оба массивы упорядочены по возрастанию
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// test1.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int main()
{
    // Считываем размеры массивов,
    // который необходимо слить в
    // один отсортированный массив
    int n, m;
    cin >> n >> m;
 
    // Динамически выделяем память под
    // хранение массивов размера n и m
    int *a = new int[n];
    int *b = new int[m];
   
    // Считываем массивы;
    // По условию алгоритма они уже
    // должны быть отсортированы
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
 
    for (int i = 0; i < m; i++)
    {
        cin >> b[i];
    }
 
    // Динамически выделяем память под
    // хранение массива, полученного
    // слиянием двух исходных, его
    // размер, очевидно, равен n + m
    int *result = new int[n + m];
 
    // Заведем два индекса, указывающих
    // на первый необработанный элемент
    // первого и второго массивов
    int i = 0, j = 0;
 
    // И заведем индекс массива-результата,
    // который указывает позицию, которая
    // будет заполнена на текущем шаге
    int index = 0;
 
    // Будем повторять сравнение элементов
    // массивов a и b до тех пор, пока
    // в каждом из них есть хотя бы один
    // необработанный элемент
    while (i < n && j < m)
    {
        // В соответствии с тем, текущий элемент
        // какого массива меньше, мы записываем
        // этот элемент в массив-результат и
        // обновляем нужный индекс (i или j)
        if (a[i] < b[j])
        {
            result[index] = a[i];
            i++;
            
        }
        else
        {
            result[index] = b[j];
            j++;
            
        }
 
        index++;
    }
 
    // После выполнения предыдущего цикла
    // все элементы одного из массивов будут
    // обработаны, тогда оставшиеся элементы
    // другого массива нужно просто дописать
    // в массив-результат
    
    // Заметим, что одно из условий (i < n)
    // или (j < m) будет гарантированно ложно
    while (i < n)
    {
        result[index] = a[i];
        index++;
        i++;
    }
 
    while (j < m)
    {
        result[index] = b[j];
        index++;
        j++;
    }
 
    // Выводим отсортированный массив
    for (int k = 0; k < n + m; k++)
    {
        cout << result[k] << ' ';
    }
system("PAUSE");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2013, 20:09
Ответы с готовыми решениями:

Получить массив С(К), упорядоченный по возрастанию, путем слияния массивов A(N) и B(M), упорядоченных по возрастанию (K = N + M)
Ребята выручите пожалуйста! Получить массив С(К), упорядоченный по возрастанию, путем слияния массивов A(N) и B(M), упорядоченных по...

Получить массив С(К). упорядоченный по возрастанию, путем слияния массивов A(N) и В(М). упорядоченных по возрастанию (К = N + М).
Получить массив С(К). упорядоченный по возрастанию, путем слияния массивов A(N) и В(М). упорядоченных по возрастанию (К = N + М). ...

Массив: Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возрастанию.
написать программы! Вот задания! Я болел и просто не успею все зделать! 1)Дан массив целых чисел. Воспользовавшись указателями,...

13
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
13.06.2013, 20:17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
 
using namespace std;
 
int main ()
{
    vector<int> A {1, 3, 5, 7};
    vector<int> B {0, 2, 4, 6};
    vector<int> C;
    if (!is_sorted( begin(A), end(A) )) reverse( begin(A), end(A) );
    if (!is_sorted( begin(B), end(B) )) reverse( begin(B), end(B) );
    merge( begin(A), end(A), begin(B), end(B), back_inserter<vector<int>>( C ) );
    for (auto x : C) cout << x << ", ";
    return 0;
}
Добавлено через 2 минуты
http://ideone.com/wDLRkr
0
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
13.06.2013, 20:23  [ТС]
Решение должно быть тривиальным. То есть на уровне студента, который С++ видит почти второй раз.

Добавлено через 2 минуты
Весь инет обшарил, где знал, но везде примеры упорядоченных массивов по возрастанию.

Добавлено через 2 минуты
Просто входные данные могут быть разные. Вот думаю может после ввода массива, не зависимо от сортировки его по убыванию/по возрастанию, тупо сортировать? что бы выше приведенный код работал))
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
13.06.2013, 20:56
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
#include <iostream>
 
using namespace std;
 
void _reverse(int *first, int *last)
{
    while (first != last && first != --last ) {
        swap(*first, *last);
        ++first;
    }
}
 
bool SortedASC(int *first, int *last)
{
    --last;
    while (first != last) {
        if ( *first > *(first + 1)) return false;
        ++first;
    }
    return true;
}
int main()
{
    int a_arr[10] = {2,5,7,8,55,88,123,353,911,923};
    //int b_arr[5] = {11,14,15,32,6688};
    //int a_arr[10] = {188,133,122,111,100,99,88,77,66,55};
    int b_arr[5] = {600,50,30,20,10};
 
    int *c_arr = new int[15];
 
    bool SortedASC_A = SortedASC(a_arr, a_arr + 10);
    bool SortedASC_B = SortedASC(b_arr, b_arr + 5);
 
    if ( SortedASC_A && !SortedASC_B)
        _reverse( b_arr, b_arr + 5 );
    else if (!SortedASC_A && SortedASC_B)
        _reverse( a_arr, a_arr + 10 );
    else if (!SortedASC_A && !SortedASC_B) {
        _reverse( a_arr, a_arr + 10 );
        _reverse( b_arr, b_arr + 5 );
    }
 
    int i = 0, j = 0, k = 0;
 
    while (i < 10 && j < 5)
        if ( a_arr[i] > b_arr[j] ) {
            c_arr[k] = b_arr[j];
            ++j;
            ++k;
        } else {
            c_arr[k] = a_arr[i];
            ++i;
            ++k;
        }
    for (; i != 10; ++i, ++k) c_arr[k] = a_arr[i];
    for (; j != 5; ++j, ++k) c_arr[k] = b_arr[j];
 
    for (int l = 0; l != 15; ++l) cout << c_arr[l] << ", ";
 
    delete[] c_arr;
    return 0;
}
0
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
13.06.2013, 21:05  [ТС]
Вот с такими входными данными проверьте решение
C++
1
2
int a_arr[4] = {1,2,3,4};
int b_arr[5] = {5,4,3,1};
у меня выдало
C++
1
2
1, 2, 3, 4, 5, 4858608, 4869680, 1, 16656632, 3995988, -858993460, 4, 3, 2, 1, Д
ля продолжения нажмите любую клавишу . . .
Добавлено через 50 секунд
упс мой косяк
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
13.06.2013, 21:05
Цитата Сообщение от sedoi_starik Посмотреть сообщение
Вот с такими входными данными проверьте решение
Посмотрите на
C++
1
int *c_arr = new int[15];
C++
1
SortedASC(a_arr, a_arr + 10);
Поправите под себя.
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
13.06.2013, 21:06
здесь только под определенную длину массивов Olivеr сделал.
0
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
13.06.2013, 21:10  [ТС]
Ну да, я так и понял)). Уже потом увидел это).
Спасибо.

Добавлено через 2 минуты
А если не затруднит коменты расставить можно. Что бы понят что да как. И еще пните в нужное русло по работе с файлами. Сейчас туеву тучу страниц прочитал но так и ничего не понял.
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
13.06.2013, 21:13
http://kvodo.ru/urok-10-1-rabo... i-v-c.html
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
13.06.2013, 21:19
не знаю конечно, но надеюсь понятно
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
#include <iostream>
#include <algorithm>
using namespace std;
 
//функция переворачивает массив
void _reverse(int *first, int *last)
{
    while (first != last && first != --last ) {
        swap(*first, *last);
        ++first;
    }
}
 
//проверяет отсортирован ли массив по возрастанию
bool SortedASC(int *first, int *last)
{
    --last;
    while (first != last) {
        if ( *first > *(first + 1)) return false;
        ++first;
    }
    return true;
}
int main()
{
    const int a_arr_size = 10; //размер массива А
    const int b_arr_size = 5; //размер массива В
    
    int a_arr[a_arr_size] = {2,5,7,8,55,88,123,353,911,923};
    int b_arr[b_arr_size] = {600,50,30,20,10};
    //int b_arr[b_arr_size] = {11,14,15,32,6688};
    //int a_arr[10] = {188,133,122,111,100,99,88,77,66,55};
    
    int c_arr_size = a_arr_size + b_arr_size;
    int *c_arr = new int[c_arr_size]; //результирующий массив
 
    bool SortedASC_A = SortedASC(a_arr, a_arr + a_arr_size);
    bool SortedASC_B = SortedASC(b_arr, b_arr + b_arr_size);
 
    if ( SortedASC_A && !SortedASC_B) //если А упорядочен по возрастанию, а В - нет
        _reverse( b_arr, b_arr + b_arr_size ); //разворачиваем В
    else if (!SortedASC_A && SortedASC_B) //если В упорядочен по возрастанию, а А - нет
        _reverse( a_arr, a_arr + a_arr_size ); //разворачиваем А
    else if (!SortedASC_A && !SortedASC_B) { //если и А и В упорядочены по убыванию, то разворачиваем оба
        _reverse( a_arr, a_arr + a_arr_size );
        _reverse( b_arr, b_arr + b_arr_size );
    }
 
    int i = 0, j = 0, k = 0;
 
    //начинаем процесс слияния
    //цикл работает пока в массивах А и В есть хотя бы один не распределенный элемент
    while (i < a_arr_size && j < b_arr_size)
        if ( a_arr[i] > b_arr[j] ) {
            c_arr[k] = b_arr[j];
            ++j;
            ++k;
        } else {
            c_arr[k] = a_arr[i];
            ++i;
            ++k;
        }
    //когда один из массивов (мы не знаем какой) полностью распрделен в результирующий массив
    //то подтягиваем остальные элементы
    for (; i != a_arr_size; ++i, ++k) c_arr[k] = a_arr[i];
    for (; j != b_arr_size; ++j, ++k) c_arr[k] = b_arr[j];
 
    for (int l = 0; l != c_arr_size; ++l) cout << c_arr[l] << ", ";
 
    delete[] c_arr;
    return 0;
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
13.06.2013, 21:23
Olivеr,
C++
1
#include <algorithm>
swap все же там
1
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
13.06.2013, 21:29  [ТС]
Все понял. Огромное спасибо.
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
13.06.2013, 21:31
sedoi_starik, на входе в программу дается два одномерных отсортированных массива ( не обязательно отсортированы одинаково ). Потом алгоритм объединяет эти два массива в один отсортированный в возрастающем порядке.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
13.06.2013, 21:34
Цитата Сообщение от Olivеr Посмотреть сообщение
if ( SortedASC_A && !SortedASC_B) //если А упорядочен по возрастанию, а В - нет
* * * * _reverse( b_arr, b_arr + b_arr_size ); //разворачиваем В
* * else if (!SortedASC_A && SortedASC_B) //если В упорядочен по возрастанию, а А - нет
* * * * _reverse( a_arr, a_arr + a_arr_size ); //разворачиваем А
* * else if (!SortedASC_A && !SortedASC_B) { //если и А и В упорядочены по убыванию, то разворачиваем оба
* * * * _reverse( a_arr, a_arr + a_arr_size );
* * * * _reverse( b_arr, b_arr + b_arr_size );
* * }
мне кажется, слегка перемудрил.
C++
1
2
3
4
if (!SortedASC_A) { //если А упорядочен по убыванию то разворачиваем
    _reverse( a_arr, a_arr + a_arr_size );
if (!SortedASC_B)
    _reverse( b_arr, b_arr + b_arr_size ); //разворачиваем В
Добавлено через 1 минуту
все равно, видно, что делал человек, знающий STL
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.06.2013, 21:34
Помогаю со студенческими работами здесь

Из двух упорядоченных одномерных массивов (длины K и N) сформируйте одномерный массив размером K+N, упорядоченный в обратную сторону
вот, что получилось, как-то не очень работает program zd115; uses crt; var b:array of integer; a:array of integer; c:array ...

Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возрастанию
Хелп плиз) Даны два массива, упорядоченных по возрастанию: А и B. Сформируйте массив C, состоящий из элементов массивов А и В,...

Получить из 2 массивов путем слияния упорядоченный по возрастанию массив С
Даны два упорядоченных по возрастанию массива A(m) и B(n). Получить из них путем слияния упорядоченный по возрастанию массив С; совпадающие...

Образовать из двух массивов единый упорядоченный по возрастанию массив
Даны два упорядоченных по возрастанию массива. Образовать из этих двух массивов единый упорядоченный по возрастанию массив. задание на...

Сформируйте массив C, состоящий из элементов массивов А и В, упорядоченный по возрастанию
Даны два массива, упорядоченных по возрастанию: А и B. Сформируйте массив C, состоящий из элементов массивов А и В, упорядоченный по...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru