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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
sedoi_starik
1 / 1 / 0
Регистрация: 13.06.2013
Сообщений: 35
13.06.2013, 20:09     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #1
Задача такая, на форуме где то была уже. Но суть совсем другая.
Есть два упорядоченных массива одномерных массива А(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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2013, 20:09     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию
Посмотрите здесь:

C++ Массив: Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возрастанию.
C++ Сортировка одномерных массивов!!!
Даны два произвольных одномерных массива действительных чисел М1 и М2. Сформировать слиянием этих массивов упорядоченный массив М3 C++
C++ Включить новый элемент в массив, упорядоченный по возрастанию, с сохранением упорядоченности. (рандомный массив)
C++ Получить массив С(К). упорядоченный по возрастанию, путем слияния массивов A(N) и В(М). упорядоченных по возрастанию (К = N + М).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
13.06.2013, 20:17     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #2
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
sedoi_starik
1 / 1 / 0
Регистрация: 13.06.2013
Сообщений: 35
13.06.2013, 20:23  [ТС]     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #3
Решение должно быть тривиальным. То есть на уровне студента, который С++ видит почти второй раз.

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

Добавлено через 2 минуты
Просто входные данные могут быть разные. Вот думаю может после ввода массива, не зависимо от сортировки его по убыванию/по возрастанию, тупо сортировать? что бы выше приведенный код работал))
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
13.06.2013, 20:56     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #4
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;
}
sedoi_starik
1 / 1 / 0
Регистрация: 13.06.2013
Сообщений: 35
13.06.2013, 21:05  [ТС]     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #5
Вот с такими входными данными проверьте решение
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 секунд
упс мой косяк
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
13.06.2013, 21:05     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #6
Цитата Сообщение от sedoi_starik Посмотреть сообщение
Вот с такими входными данными проверьте решение
Посмотрите на
C++
1
int *c_arr = new int[15];
C++
1
SortedASC(a_arr, a_arr + 10);
Поправите под себя.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
13.06.2013, 21:06     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #7
здесь только под определенную длину массивов Olivеr сделал.
sedoi_starik
1 / 1 / 0
Регистрация: 13.06.2013
Сообщений: 35
13.06.2013, 21:10  [ТС]     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #8
Ну да, я так и понял)). Уже потом увидел это).
Спасибо.

Добавлено через 2 минуты
А если не затруднит коменты расставить можно. Что бы понят что да как. И еще пните в нужное русло по работе с файлами. Сейчас туеву тучу страниц прочитал но так и ничего не понял.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
13.06.2013, 21:13     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #9
http://kvodo.ru/urok-10-1-rabota-s-t...ylami-v-c.html
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
13.06.2013, 21:19     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #10
не знаю конечно, но надеюсь понятно
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;
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
13.06.2013, 21:23     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #11
Olivеr,
C++
1
#include <algorithm>
swap все же там
sedoi_starik
1 / 1 / 0
Регистрация: 13.06.2013
Сообщений: 35
13.06.2013, 21:29  [ТС]     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #12
Все понял. Огромное спасибо.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
13.06.2013, 21:31     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #13
sedoi_starik, на входе в программу дается два одномерных отсортированных массива ( не обязательно отсортированы одинаково ). Потом алгоритм объединяет эти два массива в один отсортированный в возрастающем порядке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 21:34     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию
Еще ссылки по теме:

Получить массив С(К), упорядоченный по возрастанию, путем слияния массивов A(N) и B(M), упорядоченных по возрастанию (K = N + M) C++
Из двух упорядоченных одномерных массивов длины К и Н сформируйте одномерный массив размером К+Н упорядоченный так же как и исходный C++
C++ Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возрастанию

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
13.06.2013, 21:34     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию #14
Цитата Сообщение от 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
Yandex
Объявления
13.06.2013, 21:34     Сортировка 2-х одномерных массивов в 1 упорядоченный массив по возрастанию
Ответ Создать тему
Опции темы

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