创建一个表示整数数组索引的数组

时间:2015-03-25 12:29:05

标签: c

我们被要求创建一个返回整数指针的函数并获取参数

int *func(int *list,int size)

我想创建一个整数数组,其条目描述了当数组被排序时原始数组中的条目所具有的位置,但是如果没有对原始数组进行排序,这应该在函数内部完成 然后将一个指向entries数组的指针返回给main函数。 例如:

主阵列

3,17,9,2,11,26,5

返回的数组是

1,5,3,0,4,6,2

我正在考虑将主数组复制到另一个数组后对其进行排序!所以主要的顺序不会丢失,然后将它们一起比较以填充所需的索引数组,我认为这有点长的任何其他想法?

2 个答案:

答案 0 :(得分:1)

您的任务涉及同时对两个数组(值和位置)进行排序。要做到这一点,你可以:

  • 创建一个辅助数组,您可以在其中重新组织数组以保持值和位置彼此相邻,以便您可以使用qsort;
  • 使用(不方便)非标准qsort_r,允许您通过void * ointer或
  • 将额外信息传递给排序例程
  • 推出自己的排序算法,使两个阵列保持同步。

第一种方法是最常用和最便携的方法。标准排序函数qsort可以在数组上工作,其中数组元素可以具有任何大小。所以:创建一个(值,位置)对的辅助数组,按位置排序,填充结果数组,你必须在堆上分配:

struct pair {
    int val;
    int pos;
};

int paircmp(const void *pa, const void *pb)
{
    const struct pair *a = pa;
    const struct pair *b = pb;

    return (a->val > b->val) - (a->val < b->val);
}

int *func(int array[], int n)
{
    struct pair pair[n];
    int *result;
    int i;

    for (i = 0; i < n; i++) {
        pair[i].val = array[i];
        pair[i].pos = i;
    }

    qsort(pair, n, sizeof(*pair), paircmp);

    result = malloc(n * sizeof(*result));

    for (i = 0; i < n; i++) {
        result[pair[i].pos] = i;
    }

    return result;
}

此处,paircmpqsort的比较回调函数。

[qsort_r][qsort_r]方法很干净,但qsort_r函数是一个不可移植的GNU扩展。它仍然需要一个辅助阵列。 (如果你的数组是一个排序索引数组,那么甚至不需要它。)

步骤与以前相同:创建索引的辅助数组,对其进行排序,以便对这些索引处的数组条目进行排序,然后创建结果数组:

int indexcmp(const void *pa, const void *pb, void *data)
{
    const int *a = pa;
    const int *b = pb;
    const int *array = data;

    return (array[*a] > array[*b]) - (array[*a] < array[*b]);
}

int *func2(int array[], int n)
{
    int *result = malloc(n * sizeof(*result));
    int pos[n];
    int i;

    for (i = 0; i < n; i++) pos[i] = i;

    qsort_r(pos, n, sizeof(*pos), indexcmp, array);

    for (i = 0; i < n; i++) result[pos[i]] = i;

    return result;
}

比较函数indexcmp需要另外一个参数。

第三个选项,滚动你自己的排序功能,是最有趣的,但我会把它留给你。

答案 1 :(得分:0)

这应该这样做,但我不能帮助感觉有一种更简单的方法。

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

typedef struct {
    int value;
    int index;
    int index2;
} sorter;

int cmp(const void *a, const void *b) {
    return ((sorter*)a)->value - ((sorter*)b)->value;
}

int cmp2(const void *a, const void *b) {
    return ((sorter*)a)->index - ((sorter*)b)->index;
}

int *func(int *list, int size) {
    int i, *iarray;
    sorter *sarray = malloc(size * sizeof(sorter));
    if (sarray == NULL)
        return NULL;
    for (i=0; i<size; i++) {
        sarray[i].index = i;                    // original position
        sarray[i].value = list[i];              // element value  
    }
    qsort (sarray, size, sizeof(sorter), cmp);  // sort by value
    for (i=0; i<size; i++)                      
        sarray[i].index2 = i;                   // sorted position
    qsort (sarray, size, sizeof(sorter), cmp2); // sort by original position
    iarray = malloc(size * sizeof(int));
    if (iarray == NULL) {
        free (sarray);
        return NULL;
    }
    for (i=0; i<size; i++)
        iarray[i] = sarray[i].index2;           // position when sorted
    free (sarray);
    return iarray;
}

int main(void)
{
    int i, size, *sorted, list[] = {3,17,9,2,11,26,5};
    size = sizeof(list)/sizeof(int);
    sorted = func(list, size);
    if (sorted == NULL)
        printf("Error in func\n");
    else {
        for (i=0; i<size; i++)
            printf("%d, ", sorted[i]);
        printf("\n");
        free(sorted);
    }
    return 0;
}

节目输出:

1, 5, 3, 0, 4, 6, 2,