2016-04-19 20 views
7

Mam tablicę 3 wartości zmiennoprzecinkowych:C - Sortowanie unosić tablicę natomiast śledzenie wskaźników

float norms[3]; 

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

Chcę uporządkować tę tablicę w porządku malejąco podczas śledzenia oryginalnych wskaźników wartości w tablicy.

Innymi słowy, biorąc pod tablicą norms[] = {0.4, 3.2, 1.7} z odpowiednimi wskaźnikami {0, 1, 2}, ja po prostu chce uzyskać tablicę odpowiadająca ints który odzwierciedla oryginalne pozycje wartości float w norms[] następstwie zstępującej rodzaju. W tym przypadku będzie to {1, 2, 0}.

Jaki jest najlepszy/najczystszy sposób, aby to osiągnąć?

+3

Utwórz tablicę typu int o tej samej wielkości, zawierającą indeksy. Podczas sortowania macierzy float wystarczy odzwierciedlić operację zamiany w tablicy int. – jboockmann

+1

Użyj struct z polem indeksu, napisz indeks każdego elementu przed sortowaniem, który zachowa oryginalną pozycję w tablicy. –

+0

Po prostu wykonaj kopię oryginalnej tablicy. to jest to! Nie są potrzebne żadne przemyślane algorytmy optymalizacji. Przeprowadzka ... – Lundin

Odpowiedz

7

Użyj struktury do przechowywania wartości oraz indeksu, a następnie sortuj według wartości.

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

Wystarczy użyć dowolnego algorytmu sortowania "aliasing" pierwotnego dostępu do tablicy. Przykład z bąbelkami

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

Najczystszym sposobem, jaki mogę wymyślić, jest stworzenie struktury zawierającej zarówno zmienną, jak i indeks.

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

następnie utwórz tablicę o tej strukturze i posortuj ją zgodnie z val.