我正在嘗試用他們的文章對德語單詞進行排序,但效果并不理想。你能幫助我嗎?
代碼:
#include <iostream>
#include <fstream>
#include <cstring>
#include <stdio.h>
using namespace std;
struct asd
{
string ne;
string fn;
};
int main()
{
asd szavak[50];
ifstream be("nemet.txt");
int db=0;
while (!be.eof())
{
be>>szavak[db].ne;
be>>szavak[db].fn;
cout<<szavak[db].ne<< " "<<szavak[db].fn<<endl;
db ;
}
be.close();
cout<< "\n\n"<< "Rendezve:\n";
for (int i=0; i<db-1; i )
{
for (int j=i 1; j<db; j )
{
if (szavak[j].ne<szavak[i].ne)
{
swap(szavak[j].ne,szavak[i].ne);
swap(szavak[j].fn,szavak[i].fn);
}
}
}
int sv1=0;
int sv2=0;
int sv3=0;
for (int i=0; i<db; i )
{
if (szavak[i].ne=="das")
{
sv1 ;
}
if (szavak[i].ne=="der")
{
sv2 ;
}
if (szavak[i].ne=="die")
{
sv3 ;
}
}
for (int j=0; j<sv1-1; j )
{
for (int k=j 1; k<sv1; k )
{
if (szavak[k].fn<szavak[j].fn)
{
swap(szavak[k].fn,szavak[j].fn);
}
}
}
for (int h=sv1; h<sv1 sv2-1; h )
{
for (int f=h 1; f<sv2; f )
{
if (szavak[f].fn<szavak[h].fn)
{
swap(szavak[f].fn,szavak[h].fn);
}
}
}
for (int s=sv1 sv2; s<sv1 sv2 sv3-1; s )
{
for (int l=s 1; l<sv3; l )
{
if (szavak[l].fn<szavak[s].fn)
{
swap(szavak[l].fn,szavak[s].fn);
}
}
}
for (int i=0; i<db; i )
{
cout<<szavak[i].ne<< " "<<szavak[i].fn<<endl;
}
return 0;
}
我希望它也能在“das”之后正確地對單詞進行排序,但事實并非如此。
這是我在txt中使用的單詞(一行一個單詞):
der Hafen
die Anzeige
das Einfamilienhaus
das Mehrfmilienhaus
der Mitbewohner
die Miete
die Badewanne
das Badezimmer
das Wohnzimmer
die Aussicht
das Arbeitszimmer
die Decke
der Plattenbau
der Altbau
der Neubau
der Hund
das Zimmer
das Bild
der Spiegel
die Kindern
die Waschmaschine
uj5u.com熱心網友回復:
我沒有檢查你的代碼的有效性(它有點難以閱讀),但你應該總是求助于標準庫提供的演算法(當然,除非你想學習如何撰寫排序演算法)。這有助于防止此類錯誤。在您的情況下,std::sort如果您提供asd僅比較的比較函式,則可以使用該演算法ne。
排序依據ne
以下示例以lambda 運算式的形式提供了比較函式。
std::sort(
std::begin(szavak),
std::end(szavak),
[](asd const& a, asd const& b){ return a.ne < b.ne; }
);
for (auto const& a : szavak){
std::cout << a.ne << " " << a.fn << std::endl;
}
輸出:
das Einfamilienhaus
das Mehrfmilienhaus
das Badezimmer
das Wohnzimmer
das Bild
das Arbeitszimmer
das Zimmer
der Hafen
der Mitbewohner
der Spiegel
der Plattenbau
der Altbau
der Neubau
der Hund
die Waschmaschine
die Kindern
die Decke
die Aussicht
die Badewanne
die Miete
die Anzeige
有關實時代碼示例,請參見此處
先按 排序ne,再按fn
如果要先按冠詞排序,然后按名詞排序,ne可以fn使用std::tie. 默認情況下,元組按字典順序進行比較
std::sort(
std::begin(szavak),
std::end(szavak),
[](asd const& a, asd const& b){
return std::tie(a.ne, a.fn) < std::tie(b.ne, b.fn);
}
);
輸出:
das Arbeitszimmer
das Badezimmer
das Bild
das Einfamilienhaus
das Mehrfmilienhaus
das Wohnzimmer
das Zimmer
der Altbau
der Hafen
der Hund
der Mitbewohner
der Neubau
der Plattenbau
der Spiegel
die Anzeige
die Aussicht
die Badewanne
die Decke
die Kindern
die Miete
die Waschmaschine
有關實時代碼示例,請參見此處
冒泡排序
如果您確實想學習如何撰寫排序演算法,我將首先假設您對陣列中的元素有一個比較函式true,如果兩個元素是有序的,false則回傳。然后你使用這個比較函式撰寫你的排序演算法。
這使您的排序演算法更加通用,因為您可以傳入任何您喜歡的比較函式。此外,您可以專注于演算法本身,而不必擔心您正在排序的物件型別或您對它們進行排序的標準。
基于前向迭代器和可呼叫物件的簡單冒泡排序實作可能如下所示:Comparator
template <typename ForwardIt, typename Comparator>
void sort(ForwardIt begin, ForwardIt end, Comparator const& comp)
{
bool is_sorted = false;
while (!is_sorted){
is_sorted = true; // assume the container is sorted for now
ForwardIt current = begin;
ForwardIt next = current;
next;
while(next != end){
if (!comp(*current, *next)) {
/* swap them and remember something changed */
std::iter_swap(current, next);
is_sorted = false;
}
current;
next;
}
}
}
請注意,實作對陣列中物件的型別沒有假設,也沒有對它們排序的標準做出假設。你只用
- 指向串列中元素的迭代器
current,可以遞增以獲取next串列中的元素 std::iter_swap交換兩個迭代器指向的值。- 一個模板化的
Comparator函式,它必須可以在對串列中物件的兩個 const 參考上呼叫,并回傳一個bool.
有關實時代碼示例,請參見此處
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/529486.html
標籤:C 排序
上一篇:使用AlphanumComparator鏈接JavaTreeSet
下一篇:根據r中的數值排列列
