快速排序数组并将新排序存储在C中

时间:2013-04-09 03:17:48

标签: c quicksort

我有两个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(),但它只能执行排序作业,但不存储排序方案。还有其他功能可以兼顾吗?或者如何自己编写一个函数?非常感谢。

2 个答案:

答案 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);

(其中nstartend数组中的元素数量。这会使包含值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);