C ++ Сортировка строк по размеру и алфавиту - PullRequest
0 голосов
/ 22 марта 2019

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

Кодовая часть:

#include <iostream>
#include <string>

using namespace std;

struct strs{
    string str;
    int sz; //stores size of the string
};

bool compare(string a, string b, int s){ //comparing by characters
    for(int i = 0; i < s; i++){
        if(a[i] > b[i]) return true;
    }

    return false;
}

int main(){
    int n, chk;
    bool ctr;

    cin>>n;

    strs tab[n];

    for(int i = 0; i < n; i++){
        cin>>tab[i].str;

        tab[i].sz = tab[i].str.size();
    }

    //Comparing lengths
    for(int i = 0; i < n; i++){
        chk = i;

        for(int j = i + 1; j < n; j++){

            if(tab[chk].sz > tab[j].sz){
                chk = j;
            }
        }

        if(chk != i){
            swap(tab[i].str, tab[chk].str);
            swap(tab[i].sz, tab[chk].sz);
        }
    }

    //Comparing characters
    for(int i = 0; i < n; i++){
        chk = i;

        for(int j = i + 1; j < n; j++){

            if(tab[chk].sz == tab[j].sz){

                ctr = compare(tab[chk].str, tab[j].str, tab[chk].sz);
                if(ctr) chk = j;

            }

            if(tab[i].sz < tab[j].sz) break;
        }

        if(chk != i){
            swap(tab[i].str, tab[chk].str);
            swap(tab[i].sz, tab[chk].sz);
        }
    }

    //output
    for(int i = 0; i < n; i++){
        cout<<tab[i].str<<endl;
    }

    return 0;
}

И чтобы показать, что я имею в виду под «беспорядком» (копированием с консоли) для ввода:

  • стул
  • мышь
  • угол
  • Крушение
  • ангел

Вывод выглядит так:

  • ангел
  • стул
  • мышь
  • угол
  • Крушение

Так что нет ничего похожего на сортировку, и я понятия не имею, каким образом я мог бы попытаться заставить это работать.

1 Ответ

0 голосов
/ 22 марта 2019

Вы сравниваете функцию, должно быть что-то вроде:

bool compare(const std::string& a, const std::string& b, int s){ //comparing by characters
    for(int i = 0; i < s; i++){
        if(a[i] != b[i]) return a[i] > b[i];
    }
    return false;
}

но проще использовать std::sort:

auto proj = [](const std::string& s){ return std::make_tuple(s.size(), std::ref(s)); }
auto compare = [](const std::string& lhs, const std::string& rhs)
{
    return proj(lhs) < proj(rhs);
};

std::sort(strings.begin(), strings.end(), compare);
...