2017-09-07 145 views
0

我使用下面的快速排序功能進行排序以降序任何給定陣列的索引:輸出陣列的降序

int sorting (const void * a, const void * b) 
{ 
    return (*(double*)a < *(double*)b); 
} 
int main(int argc, char *argv[]) { 

    int n; 
    double values[] = { 88.54, 56.65, 100.13, 2.091, 25.223 }; 
    qsort(values, 5, sizeof(double), sorting); 
    for(n = 0 ; n < 5; n++) { 
     printf("%f ", values[n]); 
    } 
    return(0); 

} 

除了按降序輸出的值,我要輸出其對應的indices。例如,對於給定的values[]數組,我會得到[2,0,1,4,3],這表示索引2具有最大值,索引0具有第二大值,依此類推。我如何修改上面的代碼?

謝謝

+1

我建議你閱讀更多關於[在'qsort'函數](http://en.cppreference.com/w/c/algorithm/qsort),特別是關於比較函數應該返回的內容。 –

+1

至於你的問題,你需要第二個數組與索引,你應該排序*索引*數組。然後,這是困難的部分,您需要找出一種方法將值數組傳遞給比較函數,該函數使用索引來檢查值數組中的值。 –

+2

@Someprogrammerdude:如果使用指針數組而不是索引數組,這並不難。使用指針而不是索引常常簡化C編程任務,恕我直言。 – rici

回答

1

與指數組合價值在struct,對它們進行排序,並打印索引與值一起:

struct ind_val { 
    int index; 
    double value; 
}; 
int sorting_ind_val (const void * a, const void * b) { 
    double lhs = ((struct ind_val*)a)->value; 
    double rhs = ((struct ind_val*)b)->value; 
    if (lhs < rhs) 
     return 1; 
    if (lhs > rhs) 
     return -1; 
    return 0; 
} 
... 
double values[] = { 88.54, 56.65, 100.13, 2.091, 25.223 }; 
struct ind_val pair[5]; 
for (int i = 0 ; i != 5 ; i++) { 
    pair[i].index = i; 
    pair[i].value = values[i]; 
} 
qsort(pair, 5, sizeof(struct ind_val), sorting_ind_val); 
for (int i = 0 ; i != 5 ; i++) { 
    printf("%d: %f\n", pair[i].index, pair[i].value); 
} 

Demo.

2: 100.130000 
0: 88.540000 
1: 56.650000 
4: 25.223000 
3: 2.091000 
+0

@stark謹慎解釋你的意思?畢竟,該功能在演示中似乎很好地工作(請參閱底部附近的鏈接)。 – dasblinkenlight

+0

@stark固定,謝謝! – dasblinkenlight

+0

@dasblinkenlight非常感謝。這不是從大到小?我嘗試翻轉標誌但不起作用 – Kris