2016-04-19 7 views
7

のトラックを維持しながらソート配列をフロート:C - I 3つの浮動小数点値のアレイを有するインデックス

float norms[3]; 

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

Iは、値のオリジナルインデックスのトラックを維持しながら順序降順でこの配列をソートします配列にあります。すなわち

、対応するインデックス{0, 1, 2}とアレイnorms[] = {0.4, 3.2, 1.7}を与え、私は基本的に降順ソート以下norms[]float値の元の位置を反映intsの対応する配列を取得します。この場合は{1, 2, 0}となります。

これを達成する最も良い方法は何ですか?

+3

インデックスを含む同じサイズのint型の配列を作成します。 float配列をソートするときは、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に従ってソートします。

関連する問題