C++ 中的自定义排序

问题描述 投票:0回答:1

我正在尝试制作一个程序,它将按我想要的字母对输入的文本进行排序。例如,输入:Vvb Abv Abvgd Aaa 应产生以下列表:

  1. 啊啊
  2. Abv
  3. Abvgd
  4. Vvb

我想我已经解释过了,这样你就可以得到它,我想制作自定义列表,例如:A,B,V,G,D ...并按这种方式对输入的文本进行排序,并且Aa在之前Ab 请给我 1 个如何做的例子。

这是我的代码,我尝试通过给每个字母赋予点,然后通过冒泡排序对其进行排序,但效果不佳,在某些情况下,必须是第一个的单词比必须先出现的单词有更多的点

using namespace std;
string str = "";
int founded = 0;
int prezime = 0;

//---A---
string a1[20];
int af1 = 1;
int ap1[20];
//---B---

void bubble_sort(int arr[], int n, string arr2[])
{
    for (int i = 0; i < n; ++i)
    for (int j = 0; j < n - i - 1; ++j)
    if (arr[j] > arr[j + 1])
    {
        int temp = arr[j];
        string temp2 = a1[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
        arr2[j] = arr2[j + 1];
        arr2[j + 1] = temp2;
    }
}

int main()
{
    wcout << L"Type words:\n>";
    getline(cin, str);

    for (unsigned int araz = 0; araz < str.size(); araz++) {
        if (str[araz] == ' ') {
            founded = 0;
            af1++;
            continue;
        }
        if (founded == 0) {
            if (str[araz] == 'A') {
                founded = 1;
                ap1[af1] += 1;
                a1[af1] += str[araz];
            }
        }
        else {
            a1[af1] += str[araz];
        }
    }
    for (unsigned int araz2 = 1; araz2 < str.size(); araz2++) {
        int duzina = a1[araz2].length();
        if (duzina > 0) {
            if (a1[araz2][0] == 'A') {
                if (duzina > 1) {
                    if (a1[araz2][1] == 'a') ap1[araz2] += 2;
                    if (a1[araz2][1] == 'b') ap1[araz2] += 3;
                    if (a1[araz2][1] == 'v') ap1[araz2] += 4;
                    if (a1[araz2][1] == 'g') ap1[araz2] += 5;
                    if (a1[araz2][1] == 'd') ap1[araz2] += 6;
                    if (a1[araz2][1] == 'dj') ap1[araz2] += 7;
                    if (a1[araz2][1] == 'e') ap1[araz2] += 8;
                    if (a1[araz2][1] == 'zz') ap1[araz2] += 9;
                    if (a1[araz2][1] == 'z') ap1[araz2] += 10;
                    if (a1[araz2][1] == 'i') ap1[araz2] += 11;
                    if (a1[araz2][1] == 'j') ap1[araz2] += 12;
                    if (a1[araz2][1] == 'k') ap1[araz2] += 13;
                    if (a1[araz2][1] == 'l') ap1[araz2] += 14;
                    if (a1[araz2][1] == 'lj') ap1[araz2] += 15;
                    if (a1[araz2][1] == 'm') ap1[araz2] += 16;
                    if (a1[araz2][1] == 'n') ap1[araz2] += 17;
                    if (a1[araz2][1] == 'nj') ap1[araz2] += 18;
                    if (a1[araz2][1] == 'o') ap1[araz2] += 19;
                    if (a1[araz2][1] == 'p') ap1[araz2] += 20;
                    if (a1[araz2][1] == 'r') ap1[araz2] += 21;
                    if (a1[araz2][1] == 's') ap1[araz2] += 22;
                    if (a1[araz2][1] == 't') ap1[araz2] += 23;
                    if (a1[araz2][1] == 'c') ap1[araz2] += 24;
                    if (a1[araz2][1] == 'u') ap1[araz2] += 25;
                    if (a1[araz2][1] == 'f') ap1[araz2] += 26;
                    if (a1[araz2][1] == 'h') ap1[araz2] += 27;
                    if (a1[araz2][1] == 'c') ap1[araz2] += 28;
                    if (a1[araz2][1] == 'c') ap1[araz2] += 29;
                    if (a1[araz2][1] == 'dz') ap1[araz2] += 30;
                    if (a1[araz2][1] == 's') ap1[araz2] += 31;
                }
                if (duzina > 2) {
                    if (a1[araz2][2] == 'a') ap1[araz2] += 3;
                    if (a1[araz2][2] == 'b') ap1[araz2] += 4;
                    if (a1[araz2][2] == 'v') ap1[araz2] += 5;
                    if (a1[araz2][2] == 'g') ap1[araz2] += 6;
                    if (a1[araz2][2] == 'd') ap1[araz2] += 7;
                    if (a1[araz2][2] == 'dj') ap1[araz2] += 8;
                    if (a1[araz2][2] == 'e') ap1[araz2] += 9;
                    if (a1[araz2][2] == 'zz') ap1[araz2] += 10;
                    if (a1[araz2][2] == 'z') ap1[araz2] += 11;
                    if (a1[araz2][2] == 'i') ap1[araz2] += 12;
                    if (a1[araz2][2] == 'j') ap1[araz2] += 13;
                    if (a1[araz2][2] == 'k') ap1[araz2] += 14;
                    if (a1[araz2][2] == 'l') ap1[araz2] += 15;
                    if (a1[araz2][2] == 'lj') ap1[araz2] += 16;
                    if (a1[araz2][2] == 'm') ap1[araz2] += 17;
                    if (a1[araz2][2] == 'n') ap1[araz2] += 18;
                    if (a1[araz2][2] == 'nj') ap1[araz2] += 19;
                    if (a1[araz2][2] == 'o') ap1[araz2] += 20;
                    if (a1[araz2][2] == 'p') ap1[araz2] += 21;
                    if (a1[araz2][2] == 'r') ap1[araz2] += 22;
                    if (a1[araz2][2] == 's') ap1[araz2] += 23;
                    if (a1[araz2][2] == 't') ap1[araz2] += 24;
                    if (a1[araz2][2] == 'c') ap1[araz2] += 25;
                    if (a1[araz2][2] == 'u') ap1[araz2] += 26;
                    if (a1[araz2][2] == 'f') ap1[araz2] += 27;
                    if (a1[araz2][2] == 'h') ap1[araz2] += 28;
                    if (a1[araz2][2] == 'c') ap1[araz2] += 29;
                    if (a1[araz2][2] == 'c') ap1[araz2] += 30;
                    if (a1[araz2][2] == 'dz') ap1[araz2] += 31;
                    if (a1[araz2][2] == 's') ap1[araz2] += 32;
                }
                if (duzina > 3) {
                    if (a1[araz2][3] == 'a') ap1[araz2] += 4;
                    if (a1[araz2][3] == 'b') ap1[araz2] += 5;
                    if (a1[araz2][3] == 'v') ap1[araz2] += 6;
                    if (a1[araz2][3] == 'g') ap1[araz2] += 7;
                    if (a1[araz2][3] == 'd') ap1[araz2] += 8;
                    if (a1[araz2][3] == 'dj') ap1[araz2] += 9;
                    if (a1[araz2][3] == 'e') ap1[araz2] += 10;
                    if (a1[araz2][3] == 'zz') ap1[araz2] += 11;
                    if (a1[araz2][3] == 'z') ap1[araz2] += 12;
                    if (a1[araz2][3] == 'i') ap1[araz2] += 13;
                    if (a1[araz2][3] == 'j') ap1[araz2] += 14;
                    if (a1[araz2][3] == 'k') ap1[araz2] += 15;
                    if (a1[araz2][3] == 'l') ap1[araz2] += 16;
                    if (a1[araz2][3] == 'lj') ap1[araz2] += 17;
                    if (a1[araz2][3] == 'm') ap1[araz2] += 18;
                    if (a1[araz2][3] == 'n') ap1[araz2] += 19;
                    if (a1[araz2][3] == 'nj') ap1[araz2] += 20;
                    if (a1[araz2][3] == 'o') ap1[araz2] += 21;
                    if (a1[araz2][3] == 'p') ap1[araz2] += 22;
                    if (a1[araz2][3] == 'r') ap1[araz2] += 23;
                    if (a1[araz2][3] == 's') ap1[araz2] += 24;
                    if (a1[araz2][3] == 't') ap1[araz2] += 25;
                    if (a1[araz2][3] == 'c') ap1[araz2] += 26;
                    if (a1[araz2][3] == 'u') ap1[araz2] += 27;
                    if (a1[araz2][3] == 'f') ap1[araz2] += 28;
                    if (a1[araz2][3] == 'h') ap1[araz2] += 29;
                    if (a1[araz2][3] == 'c') ap1[araz2] += 30;
                    if (a1[araz2][3] == 'c') ap1[araz2] += 31;
                    if (a1[araz2][3] == 'dz') ap1[araz2] += 32;
                    if (a1[araz2][3] == 's') ap1[araz2] += 33;
                }
                if (duzina > 4) {
                    if (a1[araz2][4] == 'a') ap1[araz2] += 5;
                    if (a1[araz2][4] == 'b') ap1[araz2] += 6;
                    if (a1[araz2][4] == 'v') ap1[araz2] += 7;
                    if (a1[araz2][4] == 'g') ap1[araz2] += 8;
                    if (a1[araz2][4] == 'd') ap1[araz2] += 9;
                    if (a1[araz2][4] == 'dj') ap1[araz2] += 10;
                    if (a1[araz2][4] == 'e') ap1[araz2] += 11;
                    if (a1[araz2][4] == 'zz') ap1[araz2] += 12;
                    if (a1[araz2][4] == 'z') ap1[araz2] += 13;
                    if (a1[araz2][4] == 'i') ap1[araz2] += 14;
                    if (a1[araz2][4] == 'j') ap1[araz2] += 15;
                    if (a1[araz2][4] == 'k') ap1[araz2] += 16;
                    if (a1[araz2][4] == 'l') ap1[araz2] += 17;
                    if (a1[araz2][4] == 'lj') ap1[araz2] += 18;
                    if (a1[araz2][4] == 'm') ap1[araz2] += 19;
                    if (a1[araz2][4] == 'n') ap1[araz2] += 20;
                    if (a1[araz2][4] == 'nj') ap1[araz2] += 21;
                    if (a1[araz2][4] == 'o') ap1[araz2] += 22;
                    if (a1[araz2][4] == 'p') ap1[araz2] += 23;
                    if (a1[araz2][4] == 'r') ap1[araz2] += 24;
                    if (a1[araz2][4] == 's') ap1[araz2] += 25;
                    if (a1[araz2][4] == 't') ap1[araz2] += 26;
                    if (a1[araz2][4] == 'c') ap1[araz2] += 27;
                    if (a1[araz2][4] == 'u') ap1[araz2] += 28;
                    if (a1[araz2][4] == 'f') ap1[araz2] += 29;
                    if (a1[araz2][4] == 'h') ap1[araz2] += 30;
                    if (a1[araz2][4] == 'c') ap1[araz2] += 31;
                    if (a1[araz2][4] == 'c') ap1[araz2] += 32;
                    if (a1[araz2][4] == 'dz') ap1[araz2] += 33;
                    if (a1[araz2][4] == 's') ap1[araz2] += 34;
                }
                if (duzina > 5) {
                    if (a1[araz2][5] == 'a') ap1[araz2] += 6;
                    if (a1[araz2][5] == 'b') ap1[araz2] += 7;
                    if (a1[araz2][5] == 'v') ap1[araz2] += 8;
                    if (a1[araz2][5] == 'g') ap1[araz2] += 9;
                    if (a1[araz2][5] == 'd') ap1[araz2] += 10;
                    if (a1[araz2][5] == 'dj') ap1[araz2] += 11;
                    if (a1[araz2][5] == 'e') ap1[araz2] += 12;
                    if (a1[araz2][5] == 'zz') ap1[araz2] += 13;
                    if (a1[araz2][5] == 'z') ap1[araz2] += 14;
                    if (a1[araz2][5] == 'i') ap1[araz2] += 15;
                    if (a1[araz2][5] == 'j') ap1[araz2] += 16;
                    if (a1[araz2][5] == 'k') ap1[araz2] += 17;
                    if (a1[araz2][5] == 'l') ap1[araz2] += 18;
                    if (a1[araz2][5] == 'lj') ap1[araz2] += 19;
                    if (a1[araz2][5] == 'm') ap1[araz2] += 20;
                    if (a1[araz2][5] == 'n') ap1[araz2] += 21;
                    if (a1[araz2][5] == 'nj') ap1[araz2] += 22;
                    if (a1[araz2][5] == 'o') ap1[araz2] += 23;
                    if (a1[araz2][5] == 'p') ap1[araz2] += 24;
                    if (a1[araz2][5] == 'r') ap1[araz2] += 25;
                    if (a1[araz2][5] == 's') ap1[araz2] += 26;
                    if (a1[araz2][5] == 't') ap1[araz2] += 27;
                    if (a1[araz2][5] == 'c') ap1[araz2] += 28;
                    if (a1[araz2][5] == 'u') ap1[araz2] += 29;
                    if (a1[araz2][5] == 'f') ap1[araz2] += 30;
                    if (a1[araz2][5] == 'h') ap1[araz2] += 31;
                    if (a1[araz2][5] == 'c') ap1[araz2] += 32;
                    if (a1[araz2][5] == 'c') ap1[araz2] += 33;
                    if (a1[araz2][5] == 'dz') ap1[araz2] += 34;
                    if (a1[araz2][5] == 's') ap1[araz2] += 35;
                }
                if (duzina > 6) {
                    if (a1[araz2][6] == 'a') ap1[araz2] += 7;
                    if (a1[araz2][6] == 'b') ap1[araz2] += 8;
                    if (a1[araz2][6] == 'v') ap1[araz2] += 9;
                    if (a1[araz2][6] == 'g') ap1[araz2] += 10;
                    if (a1[araz2][6] == 'd') ap1[araz2] += 11;
                    if (a1[araz2][6] == 'dj') ap1[araz2] += 12;
                    if (a1[araz2][6] == 'e') ap1[araz2] += 13;
                    if (a1[araz2][6] == 'zz') ap1[araz2] += 14;
                    if (a1[araz2][6] == 'z') ap1[araz2] += 15;
                    if (a1[araz2][6] == 'i') ap1[araz2] += 16;
                    if (a1[araz2][6] == 'j') ap1[araz2] += 17;
                    if (a1[araz2][6] == 'k') ap1[araz2] += 18;
                    if (a1[araz2][6] == 'l') ap1[araz2] += 19;
                    if (a1[araz2][6] == 'lj') ap1[araz2] += 20;
                    if (a1[araz2][6] == 'm') ap1[araz2] += 21;
                    if (a1[araz2][6] == 'n') ap1[araz2] += 22;
                    if (a1[araz2][6] == 'nj') ap1[araz2] += 23;
                    if (a1[araz2][6] == 'o') ap1[araz2] += 24;
                    if (a1[araz2][6] == 'p') ap1[araz2] += 25;
                    if (a1[araz2][6] == 'r') ap1[araz2] += 26;
                    if (a1[araz2][6] == 's') ap1[araz2] += 27;
                    if (a1[araz2][6] == 't') ap1[araz2] += 28;
                    if (a1[araz2][6] == 'c') ap1[araz2] += 29;
                    if (a1[araz2][6] == 'u') ap1[araz2] += 30;
                    if (a1[araz2][6] == 'f') ap1[araz2] += 31;
                    if (a1[araz2][6] == 'h') ap1[araz2] += 32;
                    if (a1[araz2][6] == 'c') ap1[araz2] += 33;
                    if (a1[araz2][6] == 'c') ap1[araz2] += 34;
                    if (a1[araz2][6] == 'dz') ap1[araz2] += 35;
                    if (a1[araz2][6] == 's') ap1[araz2] += 36;
                }
                if (duzina >= 7) ap1[araz2] += 1;
                if (duzina >= 8) ap1[araz2] += 1;
                if (duzina >= 9) ap1[araz2] += 1;
                if (duzina >= 10) ap1[araz2] += 1;
                if (duzina >= 11) ap1[araz2] += 1;
                if (duzina >= 12) ap1[araz2] += 1;
                if (duzina >= 13) ap1[araz2] += 1;
                if (duzina >= 14) ap1[araz2] += 1;
                if (duzina >= 15) ap1[araz2] += 1;
                if (duzina >= 16) ap1[araz2] += 1;
                if (duzina >= 17) ap1[araz2] += 1;
                if (duzina >= 18) ap1[araz2] += 1;
                if (duzina >= 19) ap1[araz2] += 1;
                if (duzina >= 20) ap1[araz2] += 1;
            }
        }
    }

    int n = sizeof (ap1) / sizeof (ap1[0]);
    bubble_sort(ap1, n, a1);
    for (int i = 1; i < n; ++i) {
        //cout << ap1[i] << endl;
        //cout << a1[i] << endl;
        if (ap1[i] != 0) {
            cout << endl;
            cout << ap1[i];
            cout << a1[i] << endl;
        }
    }
    system("PAUSE");
    return 0;
}
c++
1个回答
3
投票

我建议您在

std::sort
标题中使用
<algorithm>
它允许您传递自己的排序运算符。在此运算符中,您必须定义您的排序。您的订单应该如下所示:

char value(char inp){
  if (inp == 'A')
    return 0;
  if (inp == 'B')
    return 1;
  if (inp == 'V')
    return 2;
  if (inp == 'G')
    return 3;
  if (inp == 'D')
    return 4;
  ...
} 

struct comp {
  bool operator()(const std::string& s1, const std::string& s2) {
    for(size_t i = 0; i < std::min(s1.size(), s2.size()) && value(s1[i]) == value(s2[i]); ++i)
      ;
    if (value(s1[i]) == value(s2[i]))
      return s1.size() < s2.size();
    return value(s1[i]) < value(s2[i]);
  }
};

甚至还有

std::lexicograpical_compare
,您可以使用:

bool value_lt(char v1, char v2){
  return v1 < v2;
}

struct comp {
  bool operator()(const std::string& s1, const std::string& s2) {
    return std::lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(), value_lt);
  }
};

如果您真正想做的是更好地理解冒泡排序,我建议您首先尝试使用标准排序来弄清楚它,然后抽象排序以利用我刚刚概述的比较之一。

© www.soinside.com 2019 - 2024. All rights reserved.