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

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

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

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

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

Даны два массива. Массив А состоит из N элементов, массив В состоит из М элементов. Оба массива отсортированы по убыванию. Разработать программу для слияния этих массивов в отсортированный по не убыванию массив С. Числа М, N ввести с клавиатуры. Память под массивы а, в, с выделить динамически. Элементы массивов А, В задать случайными целыми из диапазона [-15;20]
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2012, 08:22     Слияние двух массивов в отсортированный по не убыванию массив
Посмотрите здесь:
Провести слияние двух массивов по возрастанию, создавая третий массив C++
Сформировать третий массив из упорядоченных по убыванию значений двух массивов C++
Слияние двух массивов C++
Слияние двух динамических массивов… C++
C++ Слияние из двух массивов в один общий
Слияние двух отсортированых массивов в один C++
Слияние двух массивов, решение с помощью указателей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
31.01.2012, 08:53     Слияние двух массивов в отсортированный по не убыванию массив #2
Язык какой?
denstr
3 / 3 / 0
Регистрация: 21.11.2011
Сообщений: 143
31.01.2012, 09:06  [ТС]     Слияние двух массивов в отсортированный по не убыванию массив #3
язык с++

Добавлено через 11 минут
silent_1991, поможешь?(
co6ak
Кошковед
407 / 500 / 29
Регистрация: 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
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
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/d891ba...eac8e9ba2fab4c
Код
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/1e1919...0d41598aa5df7a
Код
18 17 16 2 -9 
11 9 7 -2 -11 
-11 -9 -2 2 7 9 11 16 17 18
co6ak
Кошковед
407 / 500 / 29
Регистрация: 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];
}
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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;
}
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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>
co6ak
Кошковед
407 / 500 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
31.01.2012, 10:06     Слияние двух массивов в отсортированный по не убыванию массив #9
да там смысл больше был показать что он умеет юзать буст, нежели выполнить поставленное задание.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
31.01.2012, 10:09     Слияние двух массивов в отсортированный по не убыванию массив #10
co6ak, Ну нифига. Задание выполняет каждый как захочет. Я бы через новый стандарт полностью выполнил и что?
co6ak
Кошковед
407 / 500 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
31.01.2012, 10:28     Слияние двух массивов в отсортированный по не убыванию массив #11
эм. представленная задача не удовлетворяет условие задачи.
вот главный критерий. второй критерий - язык С++. тут придирок нет.
AzaKendler
31.01.2012, 11:28
  #12

Не по теме:

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

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

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

ForEveR
31.01.2012, 11:40
  #13

Не по теме:

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

go
31.01.2012, 11:41
  #14

Не по теме:

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

silent_1991
31.01.2012, 11:49
  #15

Не по теме:

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

AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
31.01.2012, 11:55     Слияние двух массивов в отсортированный по не убыванию массив #16

Не по теме:

go,


Не по теме:

ForEveR, я поясню. Потому что это умение понять задачу. Задача сделать текст для новичка, чтобы он при случае мог его быстро прочитать, более менее понять ну и если надо пояснить.
Ты как опытный знаешь как да что. И если уж считаешь своим долгом оставь внизу комментарий
пару строк, что типа в больших проектах надо так то- это займет меньше места чем сумма std по тексту. А текст замусоривать не надо в таких задачах.



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
давайте каждый сам решать будет
каждый и так сам решает. просто я поясняю мнение начинающего. проще читать и понять чистый текст..Ну это все к тому что тексты читают чаще чем пишут

ForEveR
31.01.2012, 11:56
  #17

Не по теме:

AzaKendler, У меня рука не поднимется написать using namespace std и тем более using std::cout и т.п. Привычка. И переучиваться не планирую (=

AzaKendler
31.01.2012, 11:57
  #18

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
using namespace std
не это. а
C++
1
using std::cout; using std::cin;
так поднимется?


Не по теме:



C++
1
2
3
4
5
6
7
8
9
 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;

C++
1
2
3
4
5
6
7
8
9
 sort(begin(a), end(a), [] (int i, int j) { return j < i; });
   sort(begin(b), end(b), [] (int i, int j) { return j < i; });
   copy(begin(a), end(a), ostream_iterator<int> (cout, " ")); 
   cout << endl;
   copy(begin(b), end(b), ostream_iterator<int> (cout, " ")); 
   cout << endl;
   merge(a.rbegin(), a.rend(), b.rbegin(), b.rend(), begin(c));
   copy(begin(c), end(c), ostream_iterator<int> (cout, " ")); 
   cout << endl;
как по вашему из этих 2-х "объемных" текстов какой для новичка будет более читаем?
просто ответьте

silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
31.01.2012, 12:07     Слияние двух массивов в отсортированный по не убыванию массив #19
Цитата Сообщение от AzaKendler Посмотреть сообщение
так поднимется?
Цитата Сообщение от ForEveR Посмотреть сообщение
и тем более using std::cout и т.п.

Не по теме:

Мои глаза привыкли к std::, и без них код для меня выглядит как-то одиноко, пустынно... Кажется, что по редактору сейчас перекати-поле прокатится...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2012, 12:08     Слияние двух массивов в отсортированный по не убыванию массив
Еще ссылки по теме:
Слияние двух массивов, заполненных случайными числами, в третий C++
C++ Слияние массивов в упорядоченный массив
Из двух отсортированных по возрастанию массивов сформировать третий, отсортированный также по возрастанию C++
Сформировать массив путем слияние двух других C++
C++ Из двух исходных массивов, упрядоченных по возрастанию, сформировать новый, упорядоченный по убыванию

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

Или воспользуйтесь поиском по форуму:
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
31.01.2012, 12:08     Слияние двух массивов в отсортированный по не убыванию массив #20
silent_1991, ок. все заканчиваю оффтоп.
Yandex
Объявления
31.01.2012, 12:08     Слияние двух массивов в отсортированный по не убыванию массив
Ответ Создать тему
Опции темы

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