如何在不移动它们的情况下对C中的数字进行排名?

时间:2016-03-29 05:32:47

标签: c arrays logic

我想对数组进行排名,如下所示:

mat[0] = 300  
mat[1] = 200  
mat[2] = 360  
mat[3] = 230  
mat[4] = 290  

等级取决于上面的数组(最大数量得到等级1等):

rank[0] = 2  
rank[1] = 5  
rank[2] = 1  
rank[3] = 4  
rank[4] = 3  

如何在不使用任何类型的排序算法移动数组的情况下进行排名 或者通过不同的输入:

mat[0] = 400 
mat[1] = 100  
mat[2] = 220  
mat[3] = 230  
mat[4] = 50  
等级将是:

rank[0] = 1  
rank[1] = 4  
rank[2] = 3  
rank[3] = 2  
rank[4] = 5

我如何在C中执行此操作?

3 个答案:

答案 0 :(得分:1)

一种方法是创建一个数组或结构列表,每个结构包含2个变量:

  • 数组中的值(排序键),例如300,200,360等
  • 数组中元素的索引,例如0,1,2等

使用您选择的有效排序算法对数组/列表进行排序。

然后,按排序顺序迭代数组/列表,保持每次增加1的计数,并为每个结构读出原始数组中元素的索引,并将该元素设置为伯爵。

答案 1 :(得分:0)

您可以做的是遍历数组并将数字排列到第二个数组中。试试这段代码,假设lengthmatrank的长度(我可以看到,在你的情况下它是5):

int i, j, max = -1;

//First initialize rank array to zeros
for (i = 0; i < length; i++)
   rank[i] = 0;

for (i = 0; i < length; i++)
{
    for (j = 0; j < length; j++)
    {
        if ( (mat[j] > max) && (rank[j] == 0) )
        {
            max = mat[j];
            rank[j] = j+1;
        }
    }
    max = -1;
}

答案 2 :(得分:-2)

你必须改进程序。 试试这个:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 5

void greater(int[]);
int pos;
int cont = 0;

int main()
{
    int mat[SIZE] = {};
    int rank[SIZE] = {};

    for(int c = 0 ; c < SIZE; c++)
    {
        printf("numero %d:", c + 1);
        scanf("%d", &mat[c]);
    }

    printf("\n");

    for(int c = 0 ; c < SIZE; c++)
        printf("%d\t", mat[c]);


    int matCopy[SIZE];

    for (int i = 0; i < SIZE; i++)
        matCopy[i] = mat[i];



    for(int c = 0 ; c < SIZE; c++)
    {
        greater(matCopy);
        rank[pos] = c + 1 ;
    }

    printf("\n");
    for(int c = 0 ; c < SIZE; c++)
        printf("%d\t", rank[c]);

    return 0;
}


void greater(int v[])
{
    int greater = -9999;

    for(int c = 0 ; c < SIZE; c++)
    {
        if(v[c] > greater)
        {
            greater = v[c];
            pos = c;
        }

    }
    v[pos] = 0;
}