【问题标题】:Sorting an array without losing the original index in C [closed]在不丢失 C 中的原始索引的情况下对数组进行排序 [关闭]
【发布时间】:2016-04-24 04:26:11
【问题描述】:

我正在开发一个函数,它可以获取一个数组并对其进行排序而不会丢失原始索引,例如:

    originalArray[5] = {9, 2, 3, 4, 15};
    // code
    // ..

结果:

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]
*/

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

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

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

。 编辑:所以每个人都在问我到目前为止我尝试了什么,如果这有助于你帮助我,我很抱歉我没有先提到它,无论如何这是我到目前为止尝试过的,首先我尝试对数组我成功了,但我丢失了原始数组的索引,这不是我的意思,所以我想如果我创建一个新的“临时”数组并将我的原始数组复制到它并以这种方式排序我不会影响我的原始数组但我无法正确获取索引(具有这种复杂性),我考虑过使用指针,但我不知道该怎么做,所以我被卡住了!

感谢您的帮助!

【问题讨论】:

  • 请展示您的研究成果。请先阅读How to Ask页面。
  • 使用一个struct 数组来保存数据和原始索引。排序后,原始索引仍然是已知的。
  • 用数字 0..n 初始化 index 数组,在这个数组上使用 mergesortqsort 和一个排序函数,通过 index 数组间接比较,做一个最后一次将排序后的值存储到sortedArr
  • 好的,那么到目前为止你做了什么?

标签: c arrays sorting


【解决方案1】:

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

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

如果您可以调用现有的 O(n log(n)) 排序函数,您可以创建一个索引数组,从 0 到长度为 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;
}

【讨论】:

  • mergesort 具有 N.log(N) 复杂度,但需要 N 个额外空间。
【解决方案2】:

试试这个,简单明了

#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2016-02-20
    • 2013-04-13
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多