Объединить два массива в третий массив, отсортированный по убыванию - 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, что означает успешное выполнение программы.