我有两个int数组* start和* end,其大小可能是5百万。 * start存储边的起始节点编号,* end存储结束节点编号。现在我想排序*以升序方式开始并存储新的排序方案,如排序之前:
start[0] = 5
start[1] = 7
start[2] = 8
start[3] = 1
start[4] = 4
排序后,它变为
start[0] = 1
start[1] = 4
start[2] = 5
start[3] = 7
start[4] = 8
我还想存储新的订购方案,即“3 4 0 1 2”。我想存储这个新的订购方案的原因是我需要使用它重新排列*结束。 C库中有一个函数qsort(),但它只能执行排序作业,但不存储排序方案。还有其他功能可以兼顾吗?或者如何自己编写一个函数?非常感谢。
答案 0 :(得分:2)
只要比较函数可以访问qsort()
数组,就可以使用标准start
函数执行此操作。您这样做的方法是为新排序的顺序创建数组,并根据start
数组的值对 进行排序。比较函数如下所示:
int compare(const void *a, const void *b)
{
int start_a = start[*(const size_t *)a];
int start_b = start[*(const size_t *)b];
return (start_a > start_b) - (start_a < start_b);
}
然后生成排序顺序是:
size_t i;
size_t *sortorder = malloc(n * sizeof sortorder[0]);
for (i = 0; i < n; i++)
sortorder[i] = i;
qsort(sortorder, n, sizeof sortorder[0], compare);
(其中n
是start
和end
数组中的元素数量。这会使包含值sortorder
的{{1}}与问题中的示例数据保持一致,您可以使用它来创建新的{ 3, 4, 0, 1, 2 }
和start
数组。
答案 1 :(得分:1)
您应该查看您正在使用的数据结构。如果您使用:
struct data
{
int start;
int end;
};
然后,您可以分配此结构的单个数组,并使用标准qsort()
函数对其进行一次排序(一次)。您不需要排序顺序数组来排序end
数组,因为它们是并行移动的,因为它们是同一结构的成员:
int data_cmp(const void *vp1, const void *vp2)
{
const struct data *dp1 = vp1;
const struct data *dp2 = vp2;
if (dp1->start < dp2->start)
return -1;
else if (dp1->start > dp2->start)
return +1;
else
return 0;
}
然后,在其他一些功能中:
size_t nitems = 5000000;
struct data *array = malloc(nitems * sizeof(*array));
// ...load the array with start and end point values...
qsort(array, sizeof(array[0]), nitems, data_cmp);