@avion123678

Merge c типом string?

Здравствуйте, проблема в сортировке первого массива string arr, почему-то после сортировки параллельно со вторым массивом arr2, на первом месте оказывается слово из списка arr2. Но если сортировать arr отдельно, то все получается корректно, в чем может быть проблема?

#include <iostream>
#include <string>


void Merge(std::string arr[], std::string arr2[], int begin, int end) {

    int i = begin;
    int mid = begin + (end - begin) / 2;
    int j = mid + 1;
    int k = 0;

    std::string d[end - begin];
    std::string da[end - begin];

    while (i <= mid && j <= end) {
        if (arr[i] <= arr[j]) {
            d[k] = arr[i];
            da[k] = arr2[i];
            i++;
        } 
        else {
            d[k] = arr[j];
            da[k] = arr2[i];
            j++;
        }
        k++;
    }

    while (i <= mid) {
        d[k] = arr[i];
        da[k] = arr2[i];
        i++; k++;
    }

    while (j <= end) {
        d[k] = arr[j];
        da[k] = arr2[i];
        j++; k++;
    }

    for (i = 0; i < k; ++i) {
        arr[begin + i] = d[I];
        arr2[begin + i] = da[i];
    }
}

void Merge_Sort(std::string arr[], std::string arr2[], int left, int right) {

     if (left < right) {
        if (right - left == 1) {
            if (arr[left] > arr[right]) {
                std::swap(arr[left], arr[right]);
                std::swap(arr2[left], arr2[right]);
            }
        }
        else {
            Merge_Sort(arr, arr2, left, left + (right - left) / 2);
            Merge_Sort(arr, arr2, left + (right - left) / 2 + 1, right);
            Merge(arr, arr2, left, right);
        }
    }
}

int main() {
    int n = 3;
    
    std::string arr[n], arr2[n];

    arr[0] = "Russia";
    arr1[0] = "Alex";
    arr[1] = "USA";
    arr1[1] = "John";
    arr[2] = "China";
    arr1[2] = "Li";

    Merge_Sort(arr, arr2, 0, n - 1);

    std::cout << "=== " << arr[0] << " ===\n";

    for (int i = 0; i < n - 1; ++i) {
        if (arr[i] == arr[i + 1]) {
            std::cout << arr2[i] << '\n';
        }
        else {
            std::cout << arr2[i] << '\n';
            std::cout << "=== " << arr[i + 1] << " ===\n";
        }
    }
    std::cout << arr2[n - 1];

    return 0;
}


Вывод:
=== John ===
Li
=== Russia ===
Petya
=== USA ===
John
  • Вопрос задан
  • 45 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
if (arr[i] <= arr[j]) {
            d[k] = arr[i];
            da[k] = arr2[i];
            i++;
        } 
        else {
            d[k] = arr[j];
            da[k] = arr2[i];
            j++;
        }

Тут какая-то совсем уж беда с индексами arr и arr2.

std::string d[end - begin];
    std::string da[end - begin];


А тут беда с размерностями, при обращении к этим массивам вышеприведённым кодом будут выходы за пределы.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы