Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.85
denstr
3 / 3 / 0
Регистрация: 21.11.2011
Сообщений: 143
#1

Слияние двух массивов в отсортированный по не убыванию массив - C++

31.01.2012, 08:22. Просмотров 3405. Ответов 20
Метки нет (Все метки)

Даны два массива. Массив А состоит из N элементов, массив В состоит из М элементов. Оба массива отсортированы по убыванию. Разработать программу для слияния этих массивов в отсортированный по не убыванию массив С. Числа М, N ввести с клавиатуры. Память под массивы а, в, с выделить динамически. Элементы массивов А, В задать случайными целыми из диапазона [-15;20]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2012, 08:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Слияние двух массивов в отсортированный по не убыванию массив (C++):

Провести слияние двух массивов по возрастанию, создавая третий массив - C++
Провести слияние двух массивов по возрастанию, создавая третий массив. Помогите пожалуйста:(

Сформировать третий массив из упорядоченных по убыванию значений двух массивов - C++
ввести два массива действительных чисел, состоящих из 7 и 9 элементов. Сформировать третий массив из упорядоченных по убыванию значений...

Слияние двух массивов - C++
Всем привет. Возникла проблема с задачей. Даны два массива одинакоого размера. Нужно создать 3 массив который будет хранить элементы...

Слияние двух динамических массивов… - C++
Приветствую Вас!:) Задача такая: Даны два массива: A и B (числовые), упорядоченные по неубыванию. Слить их в один упорядоченный...

Слияние из двух массивов в один общий - C++
Требуется соединить два массива в один есть сложность что они считаны с файла... помогите объединить два массива в один и вывести его на...

Слияние двух отсортированых массивов в один - C++
задание: Задано два массива. Массив А состоит из N элементов и отсортированный по увеличению . Массив В состоит из N элементов и...

20
silent_1991
Эксперт С++
5006 / 3064 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
31.01.2012, 08:53 #2
Язык какой?
0
denstr
3 / 3 / 0
Регистрация: 21.11.2011
Сообщений: 143
31.01.2012, 09:06  [ТС] #3
язык с++

Добавлено через 11 минут
silent_1991, поможешь?(
0
co6ak
Кошковед
515 / 503 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
31.01.2012, 09:34 #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
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
void sortDown   ( int *, int );  // сортировка по возрастанию
void print      ( int *, int );       // вывод массива
void randomize  ( int *, int );  // рандомное заполнение массива 
 
int main()
{
    srand( time ( NULL ) );
 
    int *array_A;
    int *array_B;
    int *array_C;
 
    int N, M;
 
    std::cout << "Enter size of A: ";
    std::cin  >> N;
    std::cout << "\nEnter size of B: ";
    std::cin  >> M;
 
    array_A = new int [N];
    array_B = new int [M];
    // заполняем
    randomize ( array_A, N );
    randomize ( array_B, M );
    // сортируем
    sortDown  ( array_A, N );
    sortDown  ( array_B, M );
 
    // отображаем
    std::cout << "\nArray A[N]: \n";
    print     ( array_A, N );
    std::cout << "\nArray B[M]: \n ";
    print     ( array_B, M );
 
    array_C = new int [N + M]; // массив ц с кол-вом эл-ов Н+М
    for ( int i = 0; i < N; i ++ )
        array_C[i] = array_A[i];  // заполняем С массивом А
    for ( int i = N; i < N + M; i ++ )
        array_C[i] = array_B[i - N]; // заполняем С массивом Б
 
    sortDown   ( array_C, M+N ); // сортируем С 
    std::cout << "Array C[N+M]: \n";
    print      ( array_C, M+N );
 
 
    delete [] array_A;  // удаление массивов
    delete [] array_B;
    delete [] array_C;
 
 
    std::cin.get();
    std::cin.get();
 
    return 0;
}
 
 
void sortDown ( int * array, int size )  // пузырек
{
        int tmp;
        for (int i = 1;  i < size ; i++)
            for (int j = 0;  j < size - i; j++)
                if (array[j] > array[j+1])
                {
                    tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                }
}
 
 
void print ( int * array, int size )
{
        std::cout << std::endl;
        for ( int i = 0; i < size; i ++ )
                std::cout << array[i] << "\t";
        std::cout << std::endl;
}
 
void randomize ( int * array, int size )
{
        for ( int i = 0; i < size; i ++ )
                array[i] = rand() % 35 - 15;  // диапазон [-15; 20];
}
лови. все работает
+ добавил чутка комментов и пару строк cout
1
go
Эксперт С++
3587 / 1367 / 130
Регистрация: 16.04.2009
Сообщений: 4,527
31.01.2012, 09:38 #5
Вот
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
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <ctime>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
 
void gen_(std::vector<int>& vec, std::vector<int>& vec1, int a, int b)
{
    boost::random::mt19937 gen;
    gen.seed(static_cast<unsigned> (std::time(0)));
    boost::random::uniform_int_distribution<> dist(a, b);
    std::generate(std::begin(vec), std::end(vec), [&] () { return dist(gen); });
    std::generate(std::begin(vec1), std::end(vec1), [&] () { return dist(gen); });
}
 
int main()
{
   std::vector<int> a(5);
   std::vector<int> b(5);
   std::vector<int> c(10);
   gen_(a, b, -15, 20);
   std::sort(std::begin(a), std::end(a), [] (int i, int j) { return j < i; });
   std::sort(std::begin(b), std::end(b), [] (int i, int j) { return j < i; });
   std::copy(std::begin(a), std::end(a), std::ostream_iterator<int> (std::cout, " ")); 
   std::cout << std::endl;
   std::copy(std::begin(b), std::end(b), std::ostream_iterator<int> (std::cout, " ")); 
   std::cout << std::endl;
   std::merge(a.rbegin(), a.rend(), b.rbegin(), b.rend(), std::begin(c));
   std::copy(std::begin(c), std::end(c), std::ostream_iterator<int> (std::cout, " ")); 
   std::cout << std::endl;   
}
http://liveworkspace.org/code/d891ba124bc4312649eac8e9ba2fab4c
Код
17 4 -3 -10 -15 
7 3 3 3 -1 
-15 -10 -3 -1 3 3 3 4 7 17
Вот, если необходимо ее реализовать самому
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
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <ctime>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
 
void gen_(std::vector<int>& vec, std::vector<int>& vec1, int a, int b)
{
    boost::random::mt19937 gen;
    gen.seed(static_cast<unsigned> (std::time(0)));
    boost::random::uniform_int_distribution<> dist(a, b);
    std::generate(std::begin(vec), std::end(vec), [&] () { return dist(gen); });
    std::generate(std::begin(vec1), std::end(vec1), [&] () { return dist(gen); });
}
 
template <class InputIterator1, class InputIterator2, class OutputIterator>
  OutputIterator My_merge ( InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, InputIterator2 last2,
                         OutputIterator result )
{
  while (true) {
    *result++ = (*first2<*first1)? *first2++ : *first1++;
    if (first1==last1) return copy(first2,last2,result);
    if (first2==last2) return copy(first1,last1,result);
  }
}
 
int main()
{
   std::vector<int> a(5);
   std::vector<int> b(5);
   std::vector<int> c(10);
   gen_(a, b, -15, 20);
   std::sort(std::begin(a), std::end(a), [] (int i, int j) { return j < i; });
   std::sort(std::begin(b), std::end(b), [] (int i, int j) { return j < i; });
   std::copy(std::begin(a), std::end(a), std::ostream_iterator<int> (std::cout, " ")); 
   std::cout << std::endl;
   std::copy(std::begin(b), std::end(b), std::ostream_iterator<int> (std::cout, " ")); 
   std::cout << std::endl;
   My_merge(a.rbegin(), a.rend(), b.rbegin(), b.rend(), std::begin(c));
   std::copy(std::begin(c), std::end(c), std::ostream_iterator<int> (std::cout, " ")); 
   std::cout << std::endl;   
}
http://liveworkspace.org/code/1e1919fe2d145624ac0d41598aa5df7a
Код
18 17 16 2 -9 
11 9 7 -2 -11 
-11 -9 -2 2 7 9 11 16 17 18
0
co6ak
Кошковед
515 / 503 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
31.01.2012, 09:43 #6
блин. ошибся.
вот теперь по заданию вроде верно
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
void sortDown   ( int *, int );  // сортировка по возрастанию
void sortUp     ( int *, int );  // сортировка по убыванию
void print      ( int *, int );  // вывод массива
void randomize  ( int *, int );  // рандомное заполнение массива
 
int main()
{
    srand( time ( NULL ) );
 
    int *array_A;
    int *array_B;
    int *array_C;
 
    int N, M;
 
    std::cout << "Enter size of A: ";
    std::cin  >> N;
    std::cout << "\nEnter size of B: ";
    std::cin  >> M;
 
    array_A = new int [N];
    array_B = new int [M];
    // заполняем
    randomize ( array_A, N );
    randomize ( array_B, M );
    // сортируем
    sortDown  ( array_A, N );
    sortDown  ( array_B, M );
 
    // отображаем
    std::cout << "\nArray A[N]: \n";
    print     ( array_A, N );
    std::cout << "\nArray B[M]: \n ";
    print     ( array_B, M );
 
    array_C = new int [N + M]; // массив ц с кол-вом эл-ов Н+М
    for ( int i = 0; i < N; i ++ )
        array_C[i] = array_A[i];  // заполняем С массивом А
    for ( int i = N; i < N + M; i ++ )
        array_C[i] = array_B[i - N]; // заполняем С массивом Б
 
    sortUp     ( array_C, M+N ); // сортируем С
    std::cout << "Array C[N+M]: \n";
    print      ( array_C, M+N );
 
 
    delete [] array_A;  // удаление массивов
    delete [] array_B;
    delete [] array_C;
 
 
    std::cin.get();
    std::cin.get();
 
    return 0;
}
 
 
void sortDown ( int * array, int size )  // пузырек
{
        int tmp;
        for (int i = 1;  i < size ; i++)
            for (int j = 0;  j < size - i; j++)
                if (array[j] > array[j+1])
                {
                    tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                }
}
 
void sortUp ( int * array, int size )  // пузырек
{
        int tmp;
        for (int i = 1;  i < size ; i++)
            for (int j = 0;  j < size - i; j++)
                if (array[j] < array[j+1])
                {
                    tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                }
}
 
 
void print ( int * array, int size )
{
        std::cout << std::endl;
        for ( int i = 0; i < size; i ++ )
                std::cout << array[i] << "\t";
        std::cout << std::endl;
}
 
void randomize ( int * array, int size )
{
        for ( int i = 0; i < size; i ++ )
                array[i] = rand() % 35 - 15;  // диапазон [-15; 20];
}
0
silent_1991
Эксперт С++
5006 / 3064 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
31.01.2012, 09:44 #7
Ладно, не зря же писал))
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
/* Даны два массива. Массив А состоит из N элементов, массив В состоит из М
 * элементов. Оба массива отсортированы по убыванию. Разработать программу для
 * слияния этих массивов в отсортированный по не убыванию массив С. Числа М, N
 * ввести с клавиатуры. Память под массивы а, в, с выделить динамически.
 * Элементы массивов А, В задать случайными целыми из диапазона [-15;20]
 */
 
#include <iostream>
#include <cstdlib>
#include <ctime>
 
int random(int lower_bound, int upper_bound)
{
    return int(lower_bound + (upper_bound - lower_bound) * double(rand()) / RAND_MAX);
}
 
void random_fill(int *arr, size_t size, int lower_bound, int upper_bound)
{
    for (size_t i = 0; i < size; ++i)
        arr[i] = random(lower_bound, upper_bound);
}
 
bool greater_compare(int a, int b)
{
    return a > b;
}
 
void bubble_sort(int *arr, size_t size, bool (*compare)(int, int))
{
    for (size_t i = 0; i < size; ++i)
        for (size_t j = 0; j < size - i - 1; ++j)
            if (!compare(arr[j], arr[j + 1]))
                std::swap(arr[j], arr[j + 1]);
}
 
void print_array(int *arr, size_t size)
{
    for (size_t i = 0; i < size; ++i)
        std::cout << arr[i] << "  ";
    
    std::cout << std::endl;
}
 
void merge(int *arr1, size_t size1, int *arr2, size_t size2, int *arr3, bool (*compare)(int, int))
{
    size_t i1 = 0, i2 = 0, i3 = 0;
    
    while ((i1 < size1) && (i2 < size2))
    {
        if (compare(arr1[i1], arr2[i2]))
            arr3[i3++] = arr1[i1++];
        else
            arr3[i3++] = arr2[i2++];
    }
    
    while (i1 != size1)
        arr3[i3++] = arr1[i1++];
    
    while (i2 != size2)
        arr3[i3++] = arr2[i2++];
}
 
void reverse(int *arr, size_t size)
{
    for (int *p1 = arr, *p2 = arr + size - 1; p1 < p2; ++p1, --p2)
        std::swap(*p1, *p2);
}
 
int main()
{
    srand(unsigned(time(0)));
    
    size_t size1 = size_t(random(5, 15));
    int *arr1 = new int [size1];
    
    size_t size2 = size_t(random(5, 15));
    int *arr2 = new int [size2];
    
    random_fill(arr1, size1, -15, 20);
    random_fill(arr2, size2, -15, 20);
    
    print_array(arr1, size1);
    print_array(arr2, size2);
    
    bubble_sort(arr1, size1, greater_compare);
    bubble_sort(arr2, size2, greater_compare);
    
    print_array(arr1, size1);
    print_array(arr2, size2);
    
    size_t size3 = size1 + size2;
    int *arr3 = new int [size3];
    
    merge(arr1, size1, arr2, size2, arr3, greater_compare);
    reverse(arr3, size3);
    
    print_array(arr3, size3);
    
    delete [] arr1;
    delete [] arr2;
    delete [] arr3;
    
    return 0;
}
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
31.01.2012, 10:03 #8
go,
C++
1
2
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
Не понял смысла использования лямбд, но не использования #include <random>
1
co6ak
Кошковед
515 / 503 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
31.01.2012, 10:06 #9
да там смысл больше был показать что он умеет юзать буст, нежели выполнить поставленное задание.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
31.01.2012, 10:09 #10
co6ak, Ну нифига. Задание выполняет каждый как захочет. Я бы через новый стандарт полностью выполнил и что?
0
co6ak
Кошковед
515 / 503 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
31.01.2012, 10:28 #11
эм. представленная задача не удовлетворяет условие задачи.
вот главный критерий. второй критерий - язык С++. тут придирок нет.
0
AzaKendler
31.01.2012, 11:28
  #12

Не по теме:

из-за постоянного std:: в тексте - для новичков нечитаемо поверьте. выносите std:: в using наверх.

это понятно, что в больших проектах так надо. где здесь большой проект и теоретические конфликты?

если уж придерживаться задачи то точно не ткать везде в текст std::

0
ForEveR
31.01.2012, 11:40
  #13

Не по теме:

AzaKendler, Почему это? Так лучше писать. Лучше приучаться с самого начала так писать.

0
go
31.01.2012, 11:41
  #14

Не по теме:

Цитата Сообщение от AzaKendler Посмотреть сообщение
если уж придерживаться задачи то точно не ткать везде в текст std::
Стиль автора.

0
silent_1991
31.01.2012, 11:49     Слияние двух массивов в отсортированный по не убыванию массив
  #15

Не по теме:

AzaKendler, вот уж это давайте каждый сам решать будет. Если бы я основывался на мнении авторов тем, я бы не сидел в этом разделе, а давно перебрался бы полностью во фриланс. А тут люди скорее для себя, чем для кого-то пишут.

1
31.01.2012, 11:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2012, 11:49
Привет! Вот еще темы с ответами:

Слияние двух массивов, решение с помощью указателей - C++
помогите,пожалуйста,решить! Задан массив A из N элементов и массив B из M элементов. Сформировать массив L из массивов A и B путем их...

Слияние двух массивов, заполненных случайными числами, в третий - C++
Доброго времени суток,подскажите,возможно кто то знает как решить задачу ниже..у самого ничего не получается.. Заранее Большое Спасибо! ...

Слияние массивов в упорядоченный массив - C++
выполнить слияние упорядоченного по возрастанию А(m) и неупорядоченного(n) массивов(n&lt;&lt;m) в упорядоченный по не убыванию массив С.

Из двух отсортированных по возрастанию массивов сформировать третий, отсортированный также по возрастанию - C++
Нужно написать программу с тремя массивами :| Из двух отсортированных по возрастанию массивов сформировать третий, отсортированный также...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru