Сортировать массив структур в алфавитном порядке - PullRequest
0 голосов
/ 11 мая 2018

У меня есть структурный массив (A [#]) с именем Sheep (поскольку моя задача касается DNR овец).После того, как я выполню любую задачу, заданную мной, у меня останется следующая структура:

struct Sheep 
{
    string Vardas;
    char Fragmentas[CMax]; 
    int atitikme = 0; 
};

, а внутри моей это данные:

(string Vardas) | (char Fragmentas[CMax]) | (int atitikme)
Baltukas   TAGCTT 3
Bailioji   ATGCAA 3 
Smarkuolis AATGAA 1 

(char Fragmentas [CMax] не будетиспользуя, так что вам не нужно смотреть на это, я только назвал его, чтобы было понятно).

ВСЕ эти данные взяты из файла U2.txt и не могут быть введены вручную в коде.

Осталось только отсортировать его по следующим правилам:

  1. Он идет от большего к меньшему с помощью int atitikme.
  2. IF 'int atitikme'равно, тогда он должен будет отсортировать по' A [#]. Варды в алфавитном порядке.

Чтобы отсортировать его по int atitikme, я создал код:

string q;
char w[20];
int e;
for (int o = 0; o < n-1; o++) 
{
    for (int p = o+1; p < n-1; p++) 
    {
        if (A[p].atitikme > A[o].atitikme) 
        {
            // - Vardo Keitimas
            q = A[o].Vardas;
            A[o].Vardas = A[p].Vardas;
            A[p].Vardas = q;
            // - A[#].atitikme keitimas
            e = A[o].atitikme;
            A[o].atitikme = A[p].atitikme;
            A[p].atitikme = e;
            // - DNR farkmentu keitimas
            for (int r = 0; r < m; r++) 
            {
                w[r] = A[o].Fragmentas[r];
                A[o].Fragmentas[r] = A[p].Fragmentas[r];
                A[p].Fragmentas[r] = w[r];
             }
        }
    }
}

n = 4 |m = 6

Как / что мне нужно добавить к этому коду, чтобы он начал работать:

else if (A[p].atitikme == A[o].atitikme) 
{
    <code>
}

Что если 'atitikme' = == для другого 'atitikme', то A [p] .Vardas и A [o] .Vardas должны быть отсортированы в алфавитном порядке.но только те 2 из всего массива.

ИЛИ, если слишком сложно понять, что я имел в виду, может ли кто-нибудь опубликовать код в поле ответа, будет ли он сортироваться в алфавитном порядке между двумя строками?

ПРИМЕЧАНИЕ: данные всей строки

(строка Vardas) (char Fragmentas [CMax]) (int atitikme)

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

Вывод должен быть:

Bailioji   3
Baltukas   3
Smarkuolis 1

РЕДАКТИРОВАТЬ: Мой текущий вывод:

Baltukas   3
Bailioji   3
Smarkuolis 1

Ps .Задача позволяет использовать все до тех пор, пока она работает на C ++, и ей не нужно создавать или читать какие-либо другие файлы.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

https://en.cppreference.com/w/cpp/algorithm/sort показывает, как использовать std::sort.

Вы пишете функцию bool less_than(const Sheep& a, const Sheep& b), которая представляет порядок двух овец, а затем просто вызываете std::sort(container.begin(), container.end(), less_than);, где container является чем-то вроде вектора овец.

Редактировать: Выписана функция:

bool less_than(const Sheep& a, const Sheep& b)
{
    if(a.atitikme != b.atitikme) return a.atitikme < b.atitikme;
    return a.Vardas < b.Vardas;
}
0 голосов
/ 11 мая 2018

Лучше всего решить вашу проблему один за другим.

Сначала - определите порядок сортировки - см. Документ о - например, в std :: less

Итаквам нужен класс функтора, который определяет ваш порядок сортировки:

class SheepOrder
{
public:
    bool operator() ( const Sheep& left, const Sheep& right) const
    {
        // It goes from bigger to smaller by 'int atitikme'.
        if (left.atitikme > right.atitikme)
             return true;
        if (left.atitikme < right.atitikme)
             return false;

        //IF 'int atitikme' is equal then it will have to sort it in a in alphabetical order. 
        // I guess you meant Vardas
        return left.Vardas < right.Vardas;
    }
};

Теперь, определив порядок - просто используйте std :: sort - его можно использовать с массивами - нет проблем:

Sheep sheeps[100];
// .. 
std::sort(std::begin(sheeps), std::end(sheeps), SheepOrder{});

или:

void sortSheeps(Sheep* array, std::size_t numOFSheeps)
{
    std::sort(array, array + numOfSheeps, SheepOrder{});
}

Вы также можете использовать std::tuple, чтобы упростить определение порядка сортировки (кортеж имеет оператор <по умолчанию, если ихэлементы также имеют этот оператор): </p>

class SheepOrder
{
public:
    bool operator() ( const Sheep& left, const Sheep& right) const
    {
        return tieMembersForSorting(left) < tieMembersForSorting(right);
    }
private:
    static auto tieMembersForSorting( const Sheep& object)
    {
        return std::make_tuple(-object.atitikme, // - to revert order
                               std::ref(object.Vardas)); // ref - to not make copy of string
    } 
};

Если tieMembersForSorting определено как свободная функция - лямбда также может использоваться (так как это будет только один вкладыш):

    inline auto tieMembersForSorting( const Sheep& object)
    {
        return std::make_tuple(-object.atitikme, // - to revert order
                               std::ref(object.Vardas)); // ref - to not make copy of string
    } 

    std::sort(begin(...), end(...), [](Sheep const& left, Sheep const& right)
              { return tieMembersForSorting(left) < tieMembersForSorting(right); });                    
0 голосов
/ 11 мая 2018

Здесь я использовал std::vector<> вместо массива для хранения овец. Во-вторых, используя std::sort() и функцию lambda, вы можете легко указать, как вы хотите отсортировать элементы в std::vector<> / Sheeps. Это был бы самый простой способ приблизиться.

Вот реальный код, в случае просмотра: https://www.ideone.com/ay7TWU

#include <iostream>
#include <vector>
#include <algorithm>

struct Sheep
{
   std::string Vardas;
   std::vector<char> Fragmentas;
   int atitikme;
};

int main()
{
  std::vector<Sheep> vec =
   {
      {"Baltukas",  {'T','A','G','C','T','T'}, 3},
      {"Bailioji",  {'A','T','G','C','A','A'}, 3},
      {"Smarkuolis",{'A','A','T','G','A','A'}, 1},
      {"Hmarkuolis",{'A','A','T','G','A','A'}, 1},
      {"Kmarkuolis",{'A','A','T','G','A','A'}, 2}
   };

   std::sort(vec.begin(), vec.end(), [](const Sheep& lhs, const Sheep& rhs)
      {
         return (lhs.atitikme == rhs.atitikme) ? 
            lhs.Vardas < rhs.Vardas: // if atitikme's of sheeps are equal
            lhs.atitikme > rhs.atitikme; // if atitikme's of sheeps are not equal
      });

    for (const auto& it: vec)
        std::cout << it.Vardas << " " << it.atitikme << "\n";

    return 0;
}

Выход:

Bailioji 3
Baltukas 3
Kmarkuolis 2
Hmarkuolis 1
Smarkuolis 1
...