2016-04-19 57 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創建一個這種結構的數組。