我有一个包含3个浮点值的数组:
norms[] = {0.4, 3.2, 1.7}
我想按降序对此数组进行排序,同时跟踪数组中值的原始索引。
换句话说,假设数组{0, 1, 2}
具有相应的索引ints
,我基本上想要获得一个反映float
原始位置的相应norms[]
数组降序排序后{1, 2, 0}
中的值。在这种情况下,它将是[CacheLookup, FindsBy(How = How.CssSelector, Using = ".text-input-wrapper [name=\"login_password\"]")]
protected override IWebElement Password { get; set; }
。
实现这一目标的最佳/最干净的方法是什么?
答案 0 :(得分:9)
使用结构存储值和索引,然后根据值进行排序。
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;
}
答案 1 :(得分:4)
我能想到的最简洁的方法是创建一个包含float和index的结构。
typedef struct str {
float val;
int index;
} str;
然后创建一个这个结构的数组,并根据val
对其进行排序。
答案 2 :(得分:2)
只需使用任何排序算法'别名'原始数组访问。使用bubblesort
的示例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);