【问题标题】:How do I rank an array of numbers in C without moving them from place? [closed]如何在不移动它们的情况下对 C 中的数字数组进行排名? [关闭]
【发布时间】:2016-07-16 12:43:07
【问题描述】:

我想对一个数组进行排序,如下所示:

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 中做到这一点?

【问题讨论】:

  • 你试过了吗?你能告诉我们你的代码吗?
  • 我不想使用 C 中的内置函数
  • @Marievi 我没有任何代码,因为我只知道对数组进行排序以移动值,而不是在为它们分配新排名时将它们留在同一个地方。
  • 考虑从你的数组构造一棵树,一次一个元素。树的每个节点都是它的值。它的广度和深度决定了它的等级。您可以使用树排序 (en.wikipedia.org/wiki/Tree_sort)。当您读出树的节点时,您会按排名顺序 (martinbroadhurst.com/cpp-sorting.html#tree-sort) 取回元素。

标签: c arrays logic


【解决方案1】:

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

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

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

然后,按排序顺序遍历数组/列表,保持每次递增 1 的计数,对于每个结构,读出原始数组中元素的索引并将该元素设置为计数。

【讨论】:

    【解决方案2】:

    您可以做的是遍历数组并将数字排列到您的第二个数组中。试试这段代码,假设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;
    }
    

    【讨论】:

    • 这是非常低效的代码。
    【解决方案3】:

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

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2021-10-18
      • 1970-01-01
      • 2020-11-22
      • 2013-05-19
      相关资源
      最近更新 更多