如何使用索引对数组进行排序?

时间:2014-04-10 20:21:32

标签: c

我想按降序对整数数组进行排序,但我希望它们的索引与以前保持一致。例如:

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}

怎么做?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

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