|
|||
Лістинг програми ⇐ ПредыдущаяСтр 3 из 3 Лістинг програми
#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; }
|
|||
|