Хелпикс

Главная

Контакты

Случайная статья





Лістинг програми



Лістинг програми

 

 

#pragma hdrstop

 

//---------------------------------------------------------------------------

 

#pragma argsused

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

 

int merge (int *m1, int m1n, int *m2, int m2n, int *m3) {

int a(0), b(0);

 

while (a+b < m1n+m2n)

{

if( (b>=m2n) || ( (a<m1n) && (m1[a]<=m2[b]) ) )

   { //Копирую элемент из массива A

       m3[a+b] = m1[a];

       ++a;

   } else { //Копирую элемент из массива B

       m3[a+b] = m2[b];

       ++b;

   }

}

}

 

void mergeSort (int *massiv, int n) {

if (n < 2)

   return;

if (n == 2) {

   if(massiv[0] > massiv[1])

   {

   swap (massiv[0], massiv[1]);

   return;

   }

}

mergeSort (massiv, n/2);

mergeSort (massiv+n/2, n-n/2);

 

int *TMP = new int[n];

 

merge(massiv,n/2,massiv+n/2,n-n/2,TMP);

 

for(int i(0); i<n; ++i) massiv[i]=TMP[i];

 

delete[n] TMP; //Удаляем временный буфер

return;

}

 

 

int main(int argc, char* argv[])

{

// Объявляем переменные размеров массивов

int An;

int Bn;

 

// Запрашиваем значения размера для каждого массива у пользователя

cout<<"\nRazmer massiva A:\n";

cin>>An;

 

cout<<"\nRazmer massiva B:\n";

cin>>Bn;

 

// Создаем массивы с указаными размерами (Выделяем память под них)

int *A = new int[An];

int *B = new int[Bn];

 

// Заполняем массивы случайными числами

for (int i = 0; i<An; i++)

{

A[i] = rand() % 100 + 1;

}

for (int i = 0; i<Bn; i++)

{

B[i] = rand() % 100 + 1;

}

 

// Отобразим заполненные массивы

cout<<"\nA:\n";

for (int i = 0; i<An; i++)

{

cout<<i<<"="<<A[i]<<"\n";

}

cout<<"\nB:\n";

for (int i = 0; i<Bn; i++)

{

cout<<i<<"="<<B[i]<<"\n";

}

// Посчитаем колличество нечетных значений в массиве для переноса в новый массив

int count = 0;

for (int i = 0; i<An; i++)

{

/*

Если остаток от деления на 2 равен 0 то мы имеем дело с четным индексом,

И если значение этого елемента не является четным по противоположному

принципу, то считаем этот елемент так как он попадает под условие поставленной

задачи. Его и будем переносить

*/

   if (i%2==0 && A[i]%2!=0)

   {

           count++;

   }

}

// Ищем максимально близкое по значению к (min+max)/2 в массиве В

 

// Сначала найдем минимальное и максимальное значение в массиве

// Сначала примем за минимальное первый елемент массива

int minB = B[0];

for (int i = 0; i<Bn; i++)

{

// И если он окажется больше какого-то значения в массиве

if (B[i] < minB)

{

// Мы примем это значение как минимальное

minB = B[i];

}

}

 

// По аналогии найдем максимальное значение

int maxB = B[0];

for (int i = 0; i<Bn; i++)

{

// И если он окажется больше какого-то значения в массиве

if (B[i] > maxB)

{

// Мы примем это значение как минимальное

maxB = B[i];

}

}

 

// Теперь посчитаем чему будет равно наче условие (min+max)/2

int uslovie;

uslovie = (minB + maxB)/2;

cout<<"\nUslovioe ravno: "<<uslovie<<"\n\n";

cout<<"\n_____________________________";

// Теперь можно найти максимально близкое к этому значение в массиве В

// Принцип схож с поиском крайних значений

int blizkoeB = B[0];

for (int i = 0; i<Bn; i++)

{

// Только здесь мы сравниваем абсолютную разницу между значением елемента

// и услоивем с абсолютной разницей между условием и значением предыдущего

// максимально подходящего эелемента, по умолчанию выбираем первый элемент

if (abs(uslovie-B[i]) < abs(uslovie - blizkoeB))

{

blizkoeB = B[i];

}

}

// Теперь заполним массив С нашими значениями

// Размер увеличим на 1 так как к перенесенным добавляем еще максимально

// похожее к условию (min+max)/2 значение из массива В

count++;

int *C = new int[count];

 

// Добавим близкое первым елементом нового массива

C[0] = blizkoeB;

 

// Заполняем значениями из массива А

int j = 1;

int x = 0;

for (int i = 0; i<An; i++)

{

/*

Если остаток от деления на 2 равен 0 то мы имеем дело с четным индексом,

И если значение этого елемента не является четным по противоположному

принципу, то считаем этот елемент так как он попадает под условие поставленной

задачи. Его и будем переносить

*/

   if (i%2==0 && A[i]%2!=0)

   {

   // Четные индексы с нечетными значениями в новый массив

   C[j]=A[i];

   j++;

   }

   else {

   // Остальные сгруппируем в начале массива

   A[x]=A[i];

   x++;

   }

}

// Уменьшим размер массива до колличества оставшихся в нём елементов

An=x;

 

// Отобразим новые массив

cout<<"\nA:\n";

for (int i = 0; i<An; i++)

{

cout<<i<<"="<<A[i]<<"\n";

}

cout<<"\nC:\n";

for (int i = 0; i<count; i++)

{

cout<<i<<"="<<C[i]<<"\n";

}

cout<<"\n_____________________________\n";

 

// Отсортируем массивы

 

mergeSort (A, An);

mergeSort (B, Bn);

mergeSort (C, count);

 

 

// Отобразим новые массив

cout<<"\nA:\n";

for (int i = 0; i<An; i++)

{

cout<<i<<"="<<A[i]<<"\n";

}

cout<<"\nB:\n";

for (int i = 0; i<Bn; i++)

{

cout<<i<<"="<<B[i]<<"\n";

}

cout<<"\nC:\n";

for (int i = 0; i<count; i++)

{

cout<<i<<"="<<C[i]<<"\n";

}

cout<<"\n_____________________________\n";

 

   getch();

   return 0;

}

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.