配列に順位をつける

アトリビュートに順位をつける

アトリビュートに順位を割り振りたい場面で使うコード。

//
// アトリビュートの順位をつける
//
// Run Over:Detail

float data[];
int rank[];

for(int i = 0; i < npoints(0); i++)
{
    float width = point(0, "width", i);
    data[len(data)] = width;
}

// バブルソート(昇順)
for(int i = 0; i < len(data); i++)
{
    for(int j = 0; j < len(data); j++)
    {
        if(data[i] > data[j])
            rank[i] += 1;
    }
}

for(int i = 0; i < npoints(0); i++)
    setpointattrib(0, "rank", i, rank[i]);

pointアトリビュートのwidthに対してrankというアトリビュートを追加している。

配列を順位で返す関数

VEX内で順位が必要な場合。
以下のコードは[ 1.0, 0.51, 0.1, 0.42, 0.37 ]を入力すると[ 0, 1, 4, 2, 3 ]を返す関数。

//
// 値の配列を順位の配列で返す
//
function int[] calcRank(float array[];)
{
    float value[] = array;
    
    int order[];
    for (int i = 0; i < len(array); i++)
    {
        order[i] = i;
    }
    
    // バブルソート(降順)
    for (int i = 0; i < len(value) - 1; i++)
    {
        for (int j = len(value) - 1; j > i; j--)
        {
            if(value[j - 1] < value[j])
            {
                float temp = value[j-1];
                value[j-1] = value[j];
                value[j] = temp;
                
                int num = order[j-1];
                order[j-1] = order[j];
                order[j] = num;
            }
        }
    }
    
    int rank[];
    
    for(int i = 0; i < len(order); i++)
    {
        for(int j = 0; j < len(order); j++)
        {
            if(order[j] == i)
            {
                rank[i] = j;
                break;
            }
        }
    }

    return rank;
}

使用例

float value[] = {1.0, 0.51, 0.1, 0.42, 0.37};
int rank[] = calcRank(value);

printf(sprintf('%g', rank) + '\n');
// {0, 1, 4, 2, 3}
タイトルとURLをコピーしました