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

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

Войти
Регистрация
Восстановить пароль
 
 
Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 666
#1

Объединить 2 массива в один, в котором все числа идут по убыванию - C++

09.06.2014, 22:56. Просмотров 743. Ответов 24
Метки нет (Все метки)

Привет всем. Мне нужно объединить 2 массива в один, в котором все числа идут по убыванию. Вот подробности задачи.

Текстовый файл merge.dat содержит четыре строки. В первой строке записано натуральное число N (1 ≤ N ≤ 100 000) — количество дуболомов в первой шеренге.

Вторая строка содержит N натуральных чисел, записанных через пробел. Числа идут в невозрастающем порядке. Каждое число лежит в диапазоне от 1 до 1 000 000 000.

В третьей строке записано натуральное число M (1 ≤ M ≤ 100 000) — количество дуболомов во второй шеренге.

Четвертая строка содержит M натуральных чисел, записанных через пробел. Числа идут в невозрастающем порядке. Каждое число лежит в диапазоне от 1 до 1 000 000 000.

Формат выходного файла merge.sol

Текстовый файл merge.sol должен содержать N+M чисел, идущих в невозрастающем порядке. Каждое число — это рост соответствующего дуболома из первой или из второй шеренги. Каждое число должно выводиться в отдельную строку.

У меня есть предположения, что раз числа идут в невозрастающем порядке, то 2 массива нужно сначала отсортировать по убыванию, а потом слить вместе процедурой слияния.
Я так понимаю, что для слияния нужно использовать этот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<class T> void Merge(T const *const A, int const nA,
                             T const *const B, int const nB,
                             T *const C)
{ //Выполнить слияние массива A, содержащего nA элементов,
  //  и массива B, содержащего nB элементов.
  //  Результат записать в массив C.
 
    int a(0), b(0); //Номера текущих элементов в массивах A и B
 
    while( a+b < nA+nB ) //Пока остались элементы в массивах
    {
        if( (b>=nB) || ( (a<nA) && (A[a]<=B[b]) ) )
        { //Копирую элемент из массива A
            C[a+b] = A[a];
            ++a;
        } else { //Копирую элемент из массива B
            C[a+b] = B[b];
            ++b;
        }
    }
}
Скажите, этот код подходит? Если да, то как изменить его, чтоб числа в массиве С шли по убыванию?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2014, 22:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объединить 2 массива в один, в котором все числа идут по убыванию (C++):

Объединить элементы 2-х массивов в один массив, содержащий все различные числа - C++
Помогите пожалуйста составить программу: Даны 2 последовательности из целых чисел: a1, ..., an и b1, ..., bm. Объединить элементы этих...

Из двух массивов создать один, в котором вначале идут четные элементы, затем нечетные - C++
Заданы два массива. Создать один массив, в котором вначале идут четные элементы, затем нечетные.

Объединить два массива отсортированных по убыванию - C++
Дана массивы a и b. Элементы массива a отсортированы в порядке убывания, массива b – в порядке возрастания. Образовать из этих массивов...

Получить новый массив, в котором сначала идут положительные числа, затем нулевые, затем отрицательные исходного - C++
дан массив X(N). получить новый массив Y(N), такой, что в нем сначала идут положительные числа, затем нулевые, и затем отрицательные из Х....

За один просмотр символов строки найти все самые длинные слова, символы в которых идут в строгом возрастании кодов - C++
Есть задача: Строка состоит из слов. За один просмотр символов строки найти все самые длинные слова, символы в которых идут в строгом...

Объединить два массива в один - C++
Помогите с переводом pascal кода в C++ program prog0523b; uses crt; var x, y: array of integer; z: array of integer; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 666
10.06.2014, 16:28  [ТС] #16
alsav22, Так мне нужно long long, так как
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
M (1 ≤ M ≤ 100 000)
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
N (1 ≤ N ≤ 100 000)
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Каждое число лежит в диапазоне от 1 до 1 000 000 000.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 16:34 #17
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Так мне нужно long long, так как
И? Я вам написал причину ошибка. Вопросы по поводу scanf() и того, что вам нужно, задавайте на форуме Си, здесь С++.
Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 666
10.06.2014, 16:36  [ТС] #18
alsav22, Спасибо. Вы очень добры.
alsav22
10.06.2014, 16:42
  #19

Не по теме:

Цитата Сообщение от Sh@dow777 Посмотреть сообщение
alsav22, Спасибо. Вы очень добры.
Приходите ещё...

Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 666
10.06.2014, 16:57  [ТС] #20
alsav22, Хорошо. Вот моя другая программа. Тоже связана с сортировкой слиянием. Она была написана на Си, но для ВАС я переделал ее для С++. Та же ошибка.
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
HEAP CORRUPTION DETECTED
Что скажете?
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
#include <iostream>
#include <conio.h>
using namespace std;
 
void Merge(int *A, int first, int last)
{
    int middle, start, final, j;
    int *mas=new int[last];
    middle = (first + last) / 2;
    start = first;
    final = middle + 1;
    for (j = first; j <= last; j++)
    {
        if ((start <= middle) && ((final>last) || (A[start]<A[final])))
        {
            mas[j] = A[start];
            start++;
        }
        else
        {
            mas[j] = A[final];
            final++;
        }
    }
    for (j = first; j <= last; j++)
    {
        A[j] = mas[j];
    }
    delete[]mas;
}
void MergeSort(int *A, int first, int last)
{
    if (first<last)
    {
        MergeSort(A, first, (first + last) / 2);
        MergeSort(A, (first + last) / 2 + 1, last);
        Merge(A, first, last);
    }
}
int main()
{
    int i, n;
    
    cin >> n;
    int *A = new int[n];
 
    for (i = 0; i < n; i++)
    {
        cin >> A[i];
    }
 
    MergeSort(A, 1, n);
     
    for (i = 0; i < n; i++)
    {
        cout << A[i] << " ";
    }
    delete[]A;
    
    getch();
 
    return 0;
}
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 17:07 #21
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Та же ошибка.
И? Вопрос в чём? Отчего возникает такая ошибка? Ответ:
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
HEAP CORRUPTION DETECTED
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
10.06.2014, 17:19 #22
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Так мне нужно long long, так как
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Каждое число лежит в диапазоне от 1 до 1 000 000 000.
ну и зачем тебе long long ???
диапазон числа int от -2147483648 до 2147483647
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
int *a = new int[n];
выделяем память под int
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
scanf("%lld", &a[i]);
вводим long long
ниче что он в два раза длиннее?
в массиве каша
Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 666
10.06.2014, 17:23  [ТС] #23
alsav22, Я не понял вас. Во второй программе я ввожу размер массива, элементы массива и массив потом сортируется алгоритмом слияния. После ввода элементов массива и нажатия Enter выводит ошибку
Цитата Сообщение от alsav22 Посмотреть сообщение
HEAP CORRUPTION DETECTED
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 17:25 #24
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Я не понял вас.
Странно, что не поняли...
Запись за границу памяти (j не должно быть равно last):
C++
1
2
3
4
5
6
7
8
int *mas=new int[last];
...
for (j = first; j <= last; j++)
{
    ....
    mas[j] = 
...
}
Чтение оттуда же:
C++
1
2
3
4
for (j = first; j <= last; j++)
{
      A[j] = mas[j];
     ...
Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 666
10.06.2014, 17:32  [ТС] #25
ValeryS, alsav22, Спасибо вам. И действительно, все дело было в long long.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2014, 17:32
Привет! Вот еще темы с ответами:

Как объединить два массива в один? - C++
Вот к примеру есть два массива: int A={1,2,3,4}; int B={5,6,7,8}; Как создать третий массив С , в котором будут содержаться...

Объединить два упорядоченных массива в один - C++
Заданы два упорядоченных массива А и В, состоящих из N и M вещественных элементов соответственно. Соединить их в один массив С, так чтобы...

Из одномерного массива целых чисел, содержащего один нулевой элемент, вывести все числа - C++
Из одномерного массива целых чисел, содержащего один нулевой элемент, вывести все числа, расположенные после нуля.

Объединить два упорядоченных по возрастанию массива в один - C++
Написать программу, которая объединяет два упорядоченных по возрастанию массива в один, также упорядоченный массив.Рекомендуемый вид экрана...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.06.2014, 17:32
Ответ Создать тему
Опции темы

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