无法按字母顺序排列结构数组

时间:2015-06-19 22:39:33

标签: c arrays sorting struct structure

我试图按字母顺序对结构数组中的字符串进行排序然后打印,但我的代码不起作用。

我一直试图找出过去几个小时的原因,但无法弄明白。我敢肯定它可能是非常明显的东西,但我只编程了几个星期,我无法弄明白。

它确实编译没有错误,输出只是原始未排序数组的打印但没有aardvark,如下:男孩 头脑 腐坏的 猫 词缀 洋菜 趣多多 鹭 微开

到目前为止,这是我的代码:

var query = from p in _db.Person
                     orderby f.LastName
                     select new PersonModel
                     {
                         Id = f.PersonId,
                         LastName = f.LastName
                     };
return query.ToList();

如果有人有任何意见,我会很感激。

2 个答案:

答案 0 :(得分:2)

首先,您尝试构建的算法不是排序。你在这里得到的是(在解决下面描述的问题之后)一次冒泡排序。要对数组进行实际排序,需要调用dictioarySort 10次。有关详细信息,请参阅https://en.wikipedia.org/wiki/Bubble_sort

现在到代码中的其他问题。您只需使用strcmp

即可简化整个循环
for(i = 0; i <=  9; ++i)
{
    if( strcmp(dictionary[i].word, dictionary[i+1].word ) > 0 )
    {
        temp[i] = dictionary[i];
        dictionary[i] = dictionary[i+1];
        dictionary[i+1] = temp[i];
    }
}

但是如果你正在进行某种练习并且想要弄清楚如何按照自己的方式去做,那么你的逻辑有两个问题:

  1. 考虑单词&#34; azc&#34;和&#34; brc&#34;。它们按字母顺序排列,因此不需要进行交换。在相应地查看他们的第一个字符ab后,您应该停止比较它们。相反,您会相应地继续使用下一个字母zr,并决定根据该字母进行交换,从而导致订单错误。

  2. 交换两个单词后,您也应该停止。考虑zarb的情况。查看第一个字母zr后,您将交换单词(这是好的)。但是接下来你会看第二封信。这次单词已经被交换,因此您将查看ba,然后再次交换它们。因此,完整的解决方案将遵循:

  3. for(i = 0; i <=  9; ++i)
    {
        for( k = 0; dictionary[i].word[k] != '\0'; ++k)
        {
            if( (dictionary[i].word[k] > dictionary[i+1].word[k] ) )
            {
                temp[i] = dictionary[i];
                dictionary[i] = dictionary[i+1];
                dictionary[i+1] = temp[i];
                break; // <<-- this is new
            }
            else if( (dictionary[i].word[k] < dictionary[i+1].word[k] ) )
            {
                break; // <<-- this is new
            }
        }
    }
    

答案 1 :(得分:1)

使用strcmp()比较字符串

#include <stdio.h>
#include <string.h>

struct Entry {
    char    word[15];
    char    definition[50];
};

struct Entry dictionary[100] =  {
    {"boy",         "a boy          "                   },
    {"aardvark",    "a burrowing African mammal"        },
    {"acumen",      "mentally sharp; keen"              },
    {"addle",       "to become confused"                },
    {"cat",         "a cat"                             },
    {"affix",       "to append; attach"                 },
    {"agar",        "a jelly made from seaweed"         },
    {"ahoy",        "a nautical call of greeting"       },
    {"aigrette",    "an ornamental cluster of feathers" },
    {"ajar",        "partially opened"                  }
};



int main(void) {
    int i;
    void dictionarySort(struct Entry dictionary[]);
    dictionarySort(dictionary);
    for(i = 0; i < 10; ++i) {
        printf("%s\n", dictionary[i].word);
    }
    return 0;
}

void dictionarySort(struct Entry dictionary[]) {
    int i, j;
    char temp[100];
    for(i = 0; i <=  9; ++i) {
        for(j = i + 1; j <= 9; j++) {
            if(strcmp(dictionary[i].word, dictionary[j].word) > 0) {
                strcpy(temp, dictionary[i].word);
                strcpy(dictionary[i].word, dictionary[j].word);
                strcpy(dictionary[j].word, temp);
            }
        }
    }
}