C - 按照索引跟踪排序浮点数数组

10

我有一个由3个浮点数值组成的数组:

float norms[3];

norms[0] = 0.4;
norms[1] = 3.2;
norms[2] = 1.7;

我希望将这个数组按降序排序,同时跟踪数组中每个值的原始下标

换句话说,给定数组norms[] = {0.4, 3.2, 1.7}和对应的索引{0, 1, 2},我想要得到一个相应的int数组,反映norms[]float值在排序后的原始位置。在这种情况下,它应该是{1, 2, 0}

最好/最简洁的方法是什么?


3
创建一个整型数组,使其大小与原数组相同,该数组中包含与原数组相同数量的索引。当对浮点数数组进行排序时,只需在整型数组上反映任何交换操作即可。 - jboockmann
1
使用一个结构体并添加索引字段,在排序前写入每个元素的索引,这样可以保留数组中原有元素的位置。 - Weather Vane
1
@Lundin 这样做不能达到问题所要求的目标。 - laideybug
@Lundin,那会达到什么效果?你的“解决方案”在哪里创建了原始帖子所需的索引?您最终得到了一个排序和一个未排序的数组,但是两者之间没有索引,并且没有任何方法可以获得它,而不涉及“混乱思维、过早优化算法”。 - Dimitar Slavchev
@DimitarSlavchev 我会让删除了你所提到的四年前评论的管理员来回答那个问题。 - Lundin
3个回答

10

使用结构体来存储值以及索引,然后根据值进行排序。

struct str
{
    float value;
    int index;
};

int cmp(const void *a, const void *b)
{
    struct str *a1 = (struct str *)a;
    struct str *a2 = (struct str *)b;
    if ((*a1).value > (*a2).value)
        return -1;
    else if ((*a1).value < (*a2).value)
        return 1;
    else
        return 0;
}

int main()
{
    float arr[3] = {0.4, 3.12, 1.7};
    struct str objects[3];
    for (int i = 0; i < 3; i++)
    {
        objects[i].value = arr[i];
        objects[i].index = i;
    }
    //sort objects array according to value maybe using qsort
    qsort(objects, 3, sizeof(objects[0]), cmp);
    for (int i = 0; i < 3; i++)
        printf("%d ", objects[i].index); //will give 1 2 0
    // your code goes here
    return 0;
}


4

只需要使用任何排序算法来'别名'原始数组访问即可。以下是冒泡排序的示例:

int len = 3;
bool switched = false;

float myFloatArr[3];
int myFloatIndex[3] = {0, 1, 2};

do
{
    switched = false;
    for(i = 1; i < len; i++)
    {
        if(myFloatArr[myFloatIndex[i - 1]] < myFloatArr[myFloatIndex[i]])
        {
            int temp = myFloatIndex[i];
            myFloatIndex[i] = myFloatIndex[i - 1];
            myFloatIndex[i - 1] = temp;
            switched = true;
        }
    }
}
while(switched);

4
我能想到的最简洁方法是创建一个包含浮动和索引的结构。
typedef struct str {
float val;
int index;
} str;

然后创建一个这个结构的数组,并根据val对其进行排序。


我们该如何做到这一点?请提供一个更完整的例子。 - Jorje12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接