2016-04-19 26 views
7

我有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},我基本上要获得对应ints反映在norms[]以下降序排序的float值的原始位置的阵列。在这种情况下,它将是{1, 2, 0}

什么是最好/最干净的方式来实现这一目标?

+3

创建一个包含索引的相同大小的int类型的数组。排序浮点数组时,只需对int数组中的任何交换操作进行镜像即可。 – jboockmann

+1

使用带有索引字段的结构,在排序之前编写每个元素的索引,并保留数组中的原始位置。 –

+0

只需复制原始数组。而已。不需要混淆思想,过时的优化算法。继续... – Lundin

回答

7

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

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; 
} 
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); 
3

我能想到的最简洁的方式是创建一个既包含浮点型又包含索引的结构。

typedef struct str { 
float val; 
int index; 
} str; 

然后根据val创建一个这种结构的数组。