首页 > 解决方案 > 似乎无法让我的结构数组正确排序?

问题描述

我有一个 letterData 结构数组,标题如下:

struct letterData
{
    char letter = '0';
    double occurrencePercent = 0;
    int letterOccurrences = 0;
};

int main()
{
     letterData letters[26];
}

我正在尝试按occurrencePercent 成员对这个结构数组进行排序,如下所示:

do
    {
        bool swapped = false;
        for (int count = 0; count < 25; count++)
        {
            if (letters[count].occurrencePercent < letters[count + 1].occurrencePercent)
            {
                swap(letters[count], letters[count + 1]);
                swapped = true;
            }
        }
    } while (swapped);

int width = 0;

for (int count = 0; count < 25; count++)
    {
        if (letters[count].occurrencePercent == 0)
            width = 36;
        else
            width = 30;
        cout << "\n" << letters[count].letter << ": " << letters[count].occurrencePercent << '%';
        cout << right << setw(width) << standLetters[count].letter << ": " << standLetters[count].occurrencePercent << '%';
    }

另外,这是我的交换功能:

void swap(struct letterData& a, struct letterData& b)
{
    struct letterData temp;
    temp = a;
    a = b;
    b = temp;
}

但是,数组没有正确排序。这是调试器的样子:

Given Letter Frequency                  Standard Letter Frequency


b: 8.05085%                             e: 12.02%
a: 1.69492%                             t: 9.1%
d: 2.54237%                             a: 8.12%
c: 0%                                   o: 7.68%
f: 2.54237%                             i: 7.31%
g: 8.47458%                             n: 6.95%
h: 11.0169%                             s: 6.28%
i: 1.69492%                             r: 6.02%
e: 0%                                   h: 5.92%
k: 4.23729%                             d: 4.32%
l: 2.54237%                             l: 3.98%
m: 2.54237%                             u: 2.88%
n: 1.27119%                             c: 2.71%
o: 5.50847%                             m: 2.61%
p: 9.32203%                             f: 2.3%
q: 8.47458%                             y: 2.11%
r: 5.50847%                             w: 2.09%
s: 1.69492%                             g: 2.03%
t: 6.77966%                             p: 1.82%
u: 1.27119%                             b: 1.49%
v: 1.27119%                             v: 1.11%
w: 8.05085%                             k: 0.69%
x: 5.50847%                             x: 0.17%
j: 0%                                   q: 0.11%
y: 0%                                   j: 0.1%

在左栏中,最高百分比应位于顶部,反之亦然。为什么它不起作用?

标签: c++arrays

解决方案


对于您的原始函数,我必须对其进行正确编译和排序的唯一更改是将 swapped 的声明移到 do...while 循环之外。

我的怀疑是您在代码中的其他地方声明了该变量,这避免了编译错误,但是第二个声明掩盖了您的变量,并且 do...while 没有正确检测到交换已经发生并且只执行了一次通过在循环上。

bool swapped = false;
do
{
    swapped = false;
    for (int count = 0; count < 25; count++)
    {
        if (letters[count].occurrencePercent < letters[count + 1].occurrencePercent)
        {
            swap(letters[count], letters[count + 1]);
            swapped = true;
        }
    }
} while (swapped);

推荐阅读