2016-04-19 13 views
7

मैं 3 चल बिन्दु मूल्यों की एक सरणी है:सी - क्रमबद्ध सरणी, जबकि सूचकांक का ट्रैक रखने नाव

float norms[3]; 

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

मैं आदेश उतरते जबकि मूल्यों की मूल अनुक्रमित का ट्रैक रखने में इस सरणी क्रमबद्ध करना चाहते हैं सरणी में।

दूसरे शब्दों में, इसी सूचकांक {0, 1, 2} के साथ सरणी norms[] = {0.4, 3.2, 1.7} को देखते हुए, मैं मूल रूप से इसी ints कि मूल एक अवरोही तरह निम्नलिखित norms[] में float मूल्यों के पदों को दर्शाता है की एक सरणी प्राप्त करने के लिए चाहते हैं। इस मामले में यह {1, 2, 0} होगा।

इसे प्राप्त करने का सबसे अच्छा/साफ तरीका क्या है?

+3

इंडेक्स युक्त आकार के साथ int 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 के अनुसार यह छांटते हैं।

संबंधित मुद्दे