我想对数组进行排名,如下所示:
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中执行此操作?
答案 0 :(得分:1)
一种方法是创建一个数组或结构列表,每个结构包含2个变量:
使用您选择的有效排序算法对数组/列表进行排序。
然后,按排序顺序迭代数组/列表,保持每次增加1的计数,并为每个结构读出原始数组中元素的索引,并将该元素设置为伯爵。
答案 1 :(得分:0)
您可以做的是遍历数组并将数字排列到第二个数组中。试试这段代码,假设length
是mat
和rank
的长度(我可以看到,在你的情况下它是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;
}