2014-04-10 73 views
-2

我想按降序进行排序的整数数组,但我想他们的指数保持相同before.For例如:如何使用索引对数组进行排序?

arr[]={5,4,9,3,1,2} 

index={0,1,2,3,4,5} 

排序后:

arr[]={9,5,4,3,2,1} 

index={2,0,1,3,5,4} 

如何做到这一点?

+4

你已经试过了什么? – AntonH

+0

您可以对(value,old-index)的结构对进行排序。然后,按新顺序提取第二个组件(旧索引)。 – Gassa

回答

0

你需要修改一个标准的排序算法,而不是基于arr [i]进行评估,而是基于arr [index [i]]进行评估,并仅更改index [i]中的值。所有的排序算法最终归结为一个元素与另一个元素的比较,你所拥有的是一个额外的间接程度。

C中的数值食谱是一本很好的在线书籍,您可以从中获得这样的算法或计算机科学文本的任何介绍。

2

您应该使用带有字段(值,索引)的结构数组,然后根据值字段对其进行排序。因此,索引字段应如前所述保留。

1
#include <stdio.h> 
#include <stdlib.h> 

int *Array; 

int cmp(const void *a, const void *b){ 
    int ix = *(const int*)a; 
    int iy = *(const int*)b; 
    return Array[ix]>Array[iy] ? -1 : Array[ix]<Array[iy]; 
} 

int main(){ 
    int arr[] ={5,4,9,3,1,2}; 
    int index[]={0,1,2,3,4,5}; 
    int i, size = sizeof(index)/sizeof(*index); 
    int sorted[size]; 
    Array = arr; 
    qsort(index, size, sizeof(*index), cmp); 
    for(i=0;i<size;++i) 
     printf("%d ", sorted[i]=arr[index[i]]); 
    printf("\n"); 
    for(i=0;i<size;++i) 
     printf("%d ", index[i]); 
    printf("\n"); 

    return 0; 
}