Слияние сортировки строки - PullRequest
       42

Слияние сортировки строки

1 голос
/ 28 сентября 2019

Я пытаюсь использовать сортировку слиянием, чтобы отсортировать все символы в строке.Но у меня всегда возникают проблемы с компиляцией.В частности, у меня проблемы со строками: [if (s [i1] .compare (s [i2]) <0)] и [s [from + j] = b [j];].Любая помощь, пожалуйста? </p>

void mergeSort(string &s, int from, int to)
{
    if (from == to)
    {
        return;
    }
    int mid = (from + to) / 2;
    mergeSort(s, from, mid);
    mergeSort(s, mid + 1, to);
    merge(s, from, mid, to);

}

 void merge(string &s, int from, int mid, int to)
 {
    int n = to - from + 1;
    vector<string> b(n); // merge both halves into a temporary vector b
    int i1 = from;  
    int i2 = mid + 1; 
    int j = 0;


    while (i1 <= mid && i2 <= to)
    {
        if (s[i1].compare(s[i2]) < 0)
        {
            b[j] = s[i1];
            i1++;
        }
        else
        {
            b[j] = s[i2];
            i2++;
        }
        j++;
    }
    // copy any remaining entries of the first half
    while (i1 <= mid)
    {
        b[j] = s[i1];
        i1++;
        j++;
    }

    // copy any remaining entries of the second half
    while (i2 <= to)
    {
        b[j] = s[i2];
        i2++;
        j++;
    }
    // copy back from the temporary array
    for (j = 0; j < n; j++)
    {
        s[from + j] = b[j];
    }
 } 

int main(){
string str = "cdebfag"
if (str.length() >= 2 )
mergeSort(str, 0, str.length() - 1);

//print sorted
cout << str << endl;

return 0;

}

Ошибки:

запрос на член 'сравнить' в '(& s) -> std ::__cxx11 :: basic_string :: operator ', который имеет неклассный тип' __gnu_cxx :: __ alloc_traits, char> :: value_type '{aka' char '}

и

неверная инициализация ссылки типа 'std :: __ cxx11 :: string &' {aka 'std :: __ cxx11 :: basic_string &'} из выражения типа 'std :: vector>'

Ответы [ 2 ]

2 голосов
/ 28 сентября 2019

s[i] - это не string, это char, а char не имеет функций-членов.

Вместо:

if (s[i1].compare(s[i2]) < 0)

Вам следует попробовать что-токак:

if (s[i1] < s[i2])
1 голос
/ 28 сентября 2019

В дополнение к ответу Сида, вы должны сделать vector<char> b вместо vector<string> b.

...