对数组进行排序而不会丢失C中的原始索引

时间:2016-01-18 21:16:18

标签: c arrays sorting

我正在处理一个获取数组并对其进行排序而不会丢失原始索引的函数,例如:

sortedArr[5] = {2, 3, 4, 9, 15};
index[5] = {1, 2, 3, 0, 4};

结果:

/*
index[0] == 1 because sortedArr[0] == originalArr[1]
index[3] == 0 because sortedArr[3] == originalArr[0]
index[4] == 4 because sortedArr[4] == originalArr[4]
*/

注意

void rem_sort(int array[], int index[], int size)

等等,重点是保存数字的索引,以便我可以在另一个函数中使用它们。在示例中,我创建了两个数组(已排序和原始),它应该是我用来解释我的观点的相同数组。时间复杂度应限于O(n * log(n))。 n表示数组的大小(最大值为100)。

推荐(老师为我们推荐)使用签名功能

Path.Combine

。 编辑:所以每个人都问我到目前为止我尝试了什么,如果这有助于你帮助我,我很抱歉我没有先提到它,无论如何这是我到目前为止所尝试的,首先我试图对我成功的数组进行排序,但是我丢失了原始数组的索引,这不是我的观点,所以我想如果我做了一个新的" temp"数组并将我的原始数组复制到它并以这种方式对它进行排序我不会影响我的原始数组但是我不能正确地获得索引(具有这种复杂性),我想到使用指针但是我不知道我该怎么做所以我被卡住了!

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

试试这个,这很简单,不言自明

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

struct array_struct
{
    int value;
    int index;
};

int
compare_array_elements(const void *const x, const void *const y)
{
    const struct array_struct *sx;
    const struct array_struct *sy;

    sx = x;
    sy = y;

    return sx->value - sy->value;
}

int
main(void)
{
    struct array_struct array[5] = {{9, 0}, {2, 1}, {3, 2}, {4, 3}, {5, 4}};
    size_t size;
    size_t count;

    size = sizeof(array[0]);
    count = sizeof(array) / size;

    qsort(array, count, size, compare_array_elements);
    for (int i = 0 ; i < count ; ++i)
        fprintf(stdout, "(%d, %d, %d)\n", i, array[i].value, array[i].index);
    return 0;
}

答案 1 :(得分:0)

由于这是C而不是C ++,你需要创建自己的排序程序,因为我认为qsort()可能是O(n ^ 2)最坏的情况。

由于您将使用自己的排序程序,您可以同时对数组和索引进行排序,将它们视为元素对。

如果存在可以调用的现有O(n log(n))排序函数,则可以创建索引0到length-1的数组,并根据数组对索引数组进行排序,然后复制根据排序的索引将数组转换为临时数组,然后将临时数组复制回原始数组。

void rem_sort(int array[], int index[], int size){
    /* temp array */
    int * tmpa = malloc(size * sizeof(array[0]));
    int i;
    /* generate indices to array */
    for(i = 0; i < size; i++)
        index[i] = i;
    /* sort index according to array in O(n log(n)) time */
    sort(array, index, size);
    /* tmpa[] = sorted array[] */
    for(i = 0; i < size; i++)
        tmpa[i] = array[index[i]];
    /* copy tmpa to array */
    for(i = 0; i < size; i++)
        array[i] = tmpa[i];
    free(tmpa);
    return;
}