订购平行向量C时卡住

时间:2016-03-21 02:06:34

标签: sorting

我需要做的是读取N(下一个输入的数量),然后它将遵循以下模式:(名称)(年龄)(身高)我需要做的是打印2个列表。一个是新月的新月顺序,通过打印名称,然后按高度。一个例子是:

2
Carol, 33 1.85
Peter, 21 1.92

输出:

By age: Peter, Carol
By hight: Carol, Peter

现在,我不担心输出的确切格式或复制相同的顺序“功能”,我只是想让第一个工作,所以我可以只为copypaste的高度。我也不是真的担心优化,我只是想把重点放在我在这里做错了什么。 这是我到目前为止所得到的:

        int main(int argc, char **argv){
    char nomes[30][50], age_ord[30][50], alt_ord[30][50], aux[50];
    int idade[30], n, i, j=1, aux2;
    double altura[30];
    scanf ("%d", &n);
    for(i=0; i<n; i++){
        scanf("%s %d %lf", nomes[i], &idade[i], &altura[i]);
    }
    for(i=0;i<n; i++){
        strcpy(age_ord[i], nomes[i]);
        strcpy(alt_ord[i], nomes[i]);
    }
    for(i=0; i<n; i++){      // ordenador de idade
        j=1;
        for(;i+j<=n;j++){
            if(idade[i] > idade[i+j]){
                strcpy(aux, nomes[i+j]);
                strcpy(nomes[i+j], age_ord[i]);
                strcpy(age_ord[i], aux);
                aux2 = idade[i];
                idade[i] = idade[i+j];
                idade[i+j] = aux2;
            }
        }
    }
    printf("Por idade: ");
    for(i=0; i<n; i++){
        printf("%s, ", age_ord[i]);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

  

嗨,我认为您的排序算法存在问题。

Pls Try this segment code:
for(i=0; i<n; i++){      // ordenador de idade
    j=1;
    for(;i+j<n;j++){
  

答案 1 :(得分:0)

我发现在这些情况下最好的做法就是代码。我已经扩充了您的数据,以更好地强调排序代码,并删除了逗号:

3
Carol 33 1.85
Peter 21 1.92
Claude 29 1.89

首先,在排序过程中,您不需要复制字符串。你可以随机播放指针或索引 - 下面我使用索引。我只是为了年龄而改写它 - 我会让你的副本&amp;按照你的建议粘贴高度:

#include <stdio.h>

int main(int argc, char **argv) {

    char nomes[30][50];
    int idade[30];
    double altura[30];

    int n, aux, age_ord[30], alt_ord[30];

    // read N (the number of next inputs)
    scanf("%d", &n);

    // then it will follow the pattern: (name) (age) (height) 
    for (int i = 0; i < n; i++) {
        scanf("%s %d %lf", nomes[i], &idade[i], &altura[i]);

        age_ord[i] = alt_ord[i] = i; // initialize unsorted
    }

    for (int i = 1; i < n; i++) {
        for (int j = 0; j < n - 1; j++) {
            if (idade[age_ord[j]] > idade[age_ord[j + 1]]) {
                aux = age_ord[j];
                age_ord[j] = age_ord[j + 1];
                age_ord[j + 1] = aux;
            }
        }
    }

    printf("Por idade: ");

    for (int i = 0; i < n; i++) {
        printf("%s ", nomes[age_ord[i]]);
    }

    printf("\n");

    return 0;
}

一旦我们获得了排序的索引数组,为了获得输出,我们只需使用这些排序的索引来访问名称数组。此代码输出:

Por idade: Peter Claude Carol

你可以使用相同的嵌套循环来进行高度排序,你不需要复制它,只需在年龄之后添加if高度语句。