Объединить два массива в третий массив, отсортированный по убыванию - C (СИ)
Формулировка задачи:
Помогите пожалуйста закончить. В общем есть два массива, один отсортирован по возрастанию, второй по убыванию. Нужно объеденить эти два массива в третий массив, отсортированный по убыванию. Все сделал, все отсортировал, не могу создать третий массив, не получается. Смотрел решения на форуме. Помогите создать третий массив, хоть неотсортированный, хоть какой нибудь.
Листинг программы
- # define _CRT_SECURE_NO_WARNINGS
- # include <iostream>
- # include <stdio.h>
- # include <time.h>
- # include <windows.h>
- # include <conio.h>
- # define FALSE 0
- # define TRUE 1
- using namespace std;
- void array(int *arr,int n);
- void array1(int *arr1, int k);
- void bubbleSort(int* arrPtr, int length_arr);
- void bubbleSort1(int* arrPtr, int length_arr);
- int main()
- { SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- srand(time(NULL));
- int done = FALSE;
- char c;
- int n,k;
- printf("введите размер 1-го массива:\n");
- scanf("%d",&n);
- int *arr = new int[n];
- for( int i=0;i<n;i++)
- {
- arr[i]= rand()%100-50;
- }
- printf("Введите размер 2-го массива\n");
- scanf("%d",&k);
- int *arr1 = new int [k];
- for( int j=0;j<k;j++)
- {
- arr1[j]= rand()%100-50;
- }
- //int *result = new int [n+k];
- while (!done) {
- printf("Меню:\n"
- "1) Показать массив №1\n"
- "2) Показать массив №2\n"
- "3) Показать отсортированный массив\n"
- "4) Завершение программы\n");
- c = _getch();
- switch (toupper(c)) {
- case '1':
- array(arr,n);
- break;
- case '2':
- array1(arr1,k);
- break;
- case '3':
- break;
- case '4':
- done = TRUE;
- break;
- default:
- printf("\n\aНекорректный ввод!\n");
- }
- }
- return 0;
- }
- void array(int *arr, int n)
- { int i;
- for(i=0;i<n;i++)
- {
- printf(" %d",arr[i]);
- }
- printf("\n");
- bubbleSort(arr, n);
- printf("\nОтсоритрованный массив №1\n");
- for(int i = 0; i < n; i++)
- {
- printf(" %d",arr[i]);
- }
- printf("\n");
- }
- void array1(int *arr1, int k)
- { int j;
- for(j=0;j<k;j++)
- {
- printf(" %d",arr1[j]);
- }
- printf("\n");
- bubbleSort1(arr1, k);
- printf("\nОтсоритрованный массив №2\n");
- for(int j = 0; j < k; j++)
- {
- printf(" %d",arr1[j]);
- }
- printf("\n");
- }
- void bubbleSort(int* arrPtr, int length_arr)
- {
- int temp = 0;
- bool exit= false;
- while(!exit)
- {
- exit= true;
- for(int count = 0; count< (length_arr - 1); count++)
- if(arrPtr[count] >arrPtr[count + 1])
- {
- temp = arrPtr[count];
- arrPtr[count] = arrPtr[count + 1];
- arrPtr[count + 1] = temp;
- exit= false;
- }
- }
- }
- void bubbleSort1(int* arrPtr, int length_arr)
- {
- int temp = 0;
- bool exit= false;
- while(!exit)
- {
- exit= true;
- for(int count = 0; count< (length_arr - 1); count++)
- if(arrPtr[count] <arrPtr[count + 1])
- {
- temp = arrPtr[count];
- arrPtr[count] = arrPtr[count + 1];
- arrPtr[count + 1] = temp;
- exit= false;
- }
- }
- }
Еще забыл добавить, что третий массив не должен содержать одинаковых элементов
Решение задачи: «Объединить два массива в третий массив, отсортированный по убыванию»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <malloc.h>
- int *Merge(int *A1, int n1, int *A2, int n2)
- {
- int *R;
- int i,j,p,m,k;
- m=n1+n2;
- R=(int *) calloc(m,sizeof(int));
- i=n1-1;
- j=0;
- p=0;
- while (1)
- {
- if (i==0)
- {
- for (k=j; j<n2; j++) R[p++]=A2[j];
- break;
- }
- if (j==(n2-1))
- {
- for (k=i; i>=0; i--) R[p++]=A1[i];
- break;
- }
- if (A1[i]==A2[j])
- {R[p++]=A1[i]; i--; j++;}
- else
- if (A1[i]<A2[j])
- R[p++]=A2[j++];
- else
- R[p++]=A1[i--];
- }
- return R;
- }
- int main(int argc, char *argv[])
- {
- int A1[5]={1,2,3,4,5};
- int A2[7]={10,9,8,7,6,5,4};
- int *R,i;
- R=Merge(A1,5,A2,7);
- for (i=0; i<12; i++) printf("%d ",R[i]);
- printf("\n");
- free(R);
- system("PAUSE");
- return 0;
- }
Объяснение кода листинга программы
- В функции
Merge
объединяются два массиваA1
иA2
в один массивR
. - Массив
R
имеет размерm=n1+n2
, гдеn1
иn2
- размеры массивовA1
иA2
соответственно. - Используется функция
calloc(m,sizeof(int))
для выделения памяти под массивR
. - Переменные
i
,j
,p
,m
,k
используются для контроля выхода из цикла и для индексации массивов. - В цикле
while(1)
происходит сравнение и копирование элементов из массивовA1
иA2
в массивR
. - Если
i==0
иj<n2
, то элементы массиваA2
копируются вR
с индексами отj
доn2-1
. - Если
j==(n2-1)
иi>=0
, то элементы массиваA1
копируются вR
с индексами отi
до0-1
. - Если
A1[i]
равноA2[j]
, то элемент копируется вR
с индексомp
. - Если
A1[i]
меньшеA2[j]
, то элементA2[j]
копируется вR
с индексомp
. - Если
A1[i]
большеA2[j]
, то элементA1[i]
копируется вR
с индексомp
. - После цикла возвращается массив
R
. - В функции
main
создаются массивыA1
иA2
, и вызывается функцияMerge
для их объединения. - Результат объединения выводится на экран с помощью цикла
for
и функцииprintf
. - Массив
R
освобождается с помощью функцииfree(R)
. - Команда
system(
PAUSE)
добавлена для остановки программы до нажатия клавишиENTER
. - Функция
main
возвращает0
, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д