Попытка использовать пузырьковую сортировку для сортировки массива строк в алфавитном порядке, но сортировка возвращает обратную сторону массива - PullRequest
0 голосов
/ 05 мая 2020
• 1000
bool swapped = true;
int j = 0;
string tmp;

while (swapped)
{
    swapped = false;
        j++;
    for (int i = 0; i < n - j; i++)
    {
        if (arr[i].compare(arr[i + 1]));
        {
            tmp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = tmp;
                swapped = true;
        }
    }
}
for (int i = 0; i < n; i++)
{
    cout <<arr[i + 1];
}

Это код для пузырьковой сортировки.

ifstream file("titles.txt");

string myArray[6];


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

        file >> myArray[i];
        //cout << myArray[i];


    }

    sortStrings(myArray, 6);

и это код для чтения файла .txt.

файл содержит буквы b c adef в этом порядке, хотя на выходе я получаю edab c.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Я исправил несколько проблем, и это должно работать:

bool swapped = true;
string tmp;
int j = 0;

while (swapped)
{
    swapped = false;
    ++j;
    for (int i = 0; i < n - j; i++)
    {
        // 1. Your original code has a comma in the following line which terminates the if statement
        // 2. compare function returns signed integer indicating the relationship 
        // between two strings, and > 0 value indicates previous string is greater:
        //    http://www.cplusplus.com/reference/string/string/compare/
        if (arr[i].compare(arr[i + 1]) > 0) 
        {
            tmp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = tmp;
            swapped = true;
        }
    }
}
for (int i = 0; i < n; i++)
{
    cout <<arr[i] << endl;
}
0 голосов
/ 05 мая 2020

Точка с запятой в конце оператора if работает так, как если бы условие всегда истинно. Следующие фрагменты идентичны

if (cond);
{
   // ...
}
if (cond) { }
// ...

Взгляните std::string s compare method:

Возвращаемое значение

отрицательное значение, если *this появляется перед последовательностью символов, указанной аргументами, в лексикографическом порядке

ноль, если обе последовательности символов сравниваются эквивалентно

положительное значение, если *this появляется после последовательности символов, указанной аргументами, в лексикографическом порядке

Таким образом, вам лучше проверить, больше ли значение, чем ноль, для сортировки в порядке возрастания. Также существует оператор > для std::string, что не приведет к возникшей ошибке.

Сводка (применено форматирование):

#include <fstream>
#include <iostream>

using namespace std;

void sortStrings(string* arr, int n) {
  bool swapped = true;
  int j = 0;
  string tmp;

  while (swapped) {
    swapped = false;
    j++;
    for (int i = 0; i < n - j; i++) {
      if (arr[i].compare(arr[i + 1]) > 0) {
        tmp = arr[i];
        arr[i] = arr[i + 1];
        arr[i + 1] = tmp;
        swapped = true;
      }
    }
  }
}

int main() {
  ifstream file("titles.txt");

  string myArray[6];

  for (int i = 0; i < 6; i++) {
    file >> myArray[i];
  }

  sortStrings(myArray, 6);
  for (int i = 0; i < 6; i++) {
    cout << myArray[i] << ' ';
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...