Требуется отсортировать массив по неубыванию, используя сортировку слиянием. Чтобы...

0 голосов
136 просмотров

Требуется отсортировать массив по неубыванию, используя сортировку слиянием. Чтобы убедиться, что действительно используется сортировка слиянием, после каждого осуществленного слияния (то есть, когда соответствующий подмассив уже отсортирован!), требуется вывести индексы граничных элементов и их значения.


image

Информатика (78 баллов) | 136 просмотров
0

на каком зыке программирования реализовывать?

0

там iostream и vector в include

0

int main()
{
// Чтение данных
int n;
cin >> n;
vector v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// Вызов сортировки
vector v_sorted = merge_sort(v, 0, n);
// Вывод результата
for (int i = 0; i < n; i++) {
cout << v_sorted[i] << ' ';<br /> }
return 0;
}

0

с++

0

vector merge_sort(vector &V, int l, int r) {
// Проверяем, не равна ли длина 1
// Частный случай, при котором рекурсия завершается
if (r - l == 1) {
vector res(1);
res[0] = V[l];
return res;
}
// Находим середину массива
int m = (l + r) / 2;
// Сортируем левую и правую половины независимо
vector left = merge_sort(V, l, m);
vector right = merge_sort(V, m, r);
// Сливаем отсортированные половины
return merge(left, right);
}

0

#include
#include
using namespace std;

vector merge(vector &A, vector &B) {
int i = 0;
int j = 0;
vector C(A.size() + B.size());
for (int k = 0; k < C.size(); k++) {
// Если в массиве А все элементы закончились
if (i == A.size()) {
C[k] = B[j];
j++;
// Если в массиве B все элементы закончились
} else if (j == B.size()) {
C[k] = A[i];
i++;
} else if (A[i] <= B[j]) {<br /> C[k] = A[i];
i++;
} else {
C[k] = B[j];
j++;
}
}
return C;
}

0

Он больше 500 символов, сейчас пришлю сообщением

0

ну тогда приложите код слияния, если он у Вас уже реализован

0

Нужно только вывод границ вставить

0

Есть код слияния

Дан 1 ответ
0 голосов

Код, который необходимо добавить, выделен на прикрепленной картинке красным прямоугольником.

Замечание: везде в коде не указан тип у vector. Необходимо указать тип, например vector. В прикрепленном коде все исправлено.

Весь листинг:

#include

#include

using namespace std;

vector merge(vector &A, vector &B) {

   int i = 0;

   int j = 0;

   vector C(A.size() + B.size());

   for (int k = 0; k < C.size(); k++) {

       // Если в массиве А все элементы закончились

       if (i == A.size()) {

           C[k] = B[j];

           j++;

           // Если в массиве B все элементы закончились

       } else if (j == B.size()) {

           C[k] = A[i];

           i++;

       } else if (A[i] <= B[j]) {</p>

           C[k] = A[i];

           i++;

       } else {

           C[k] = B[j];

           j++;

       }

   }

   return C;

}

vector merge_sort(vector &V, int l, int r) {

   // Проверяем, не равна ли длина 1

   // Частный случай, при котором рекурсия завершается

   if (r - l == 1) {

       vector res(1);

       res[0] = V[l];

       return res;

   }

   

   // Находим середину массива

   int m = (l + r) / 2;

   

   // Сортируем левую и правую половины независимо

   vector left = merge_sort(V, l, m);

   vector right = merge_sort(V, m, r);

   

   cout << l + 1 << ' '</p>

       << r << ' ' </p>

       << right.front() << ' '</p>

       << left.back() << endl;</p>

   // Сливаем отсортированные половины

   return merge(left, right);

}

int main(){

   

   int n;

   cin >> n;

   vector v(n);

   for (int i = 0; i < n; i++) {

       cin >> v[i];

   }

   

   // Вызов сортировки

   vector v_sorted = merge_sort(v, 0, v.size());

   // Вывод результата

   for (int i = 0; i < v.size(); i++) {

       cout << v_sorted[i] << ' ';</p>

   }

   return 0;

}


image
(4.3k баллов)
0

плохой вопрос

0

а сами тесты неизвестны?

0

на этих примерах у меня тоже правильно работает, но там проверка по тестам и один из них программа заваливает

0

Хм, я проверил на всех предоставленных примерах, еще свои некоторые придумал. Все отрабатывало.

0

При проверке выдает Wrong Answer. Что-то не так

0

Это есть в коде, просто площадка знаний не воспринимает все, что написано внутри < >. Спасибо!

0

неизвестны