quicksort可以与多个阵列一起使用吗?

时间:2017-02-05 12:00:54

标签: c arrays sorting

我在C中有一个高性能,无等待的向量实现,它允许我线性索引数组,但是使用多个数组实现。现在我需要对这个向量进行排序。显然我不能使用qsort()标准函数,因为数组不是单个内存块。

虽然没有这样实现,但假设60个槽位向量被定义为:

struct vector {
  int *buckets[4];
};

struct vector v;
v.buckets[0] = calloc(4, sizeof (int));
v.buckets[1] = calloc(8, sizeof (int));
v.buckets[2] = calloc(16, sizeof (int));
v.buckets[3] = calloc(32, sizeof (int));

我有一个简单的内联函数,可以将给定的索引值调整为0到59(例如getval(8)将返回buckets[1][4]getval(9)将返回buckets[1][5]

因此,虽然矢量可以索引线性,但它不是线性存储。可以使用quicksort来对这个向量进行排序吗?如果没有,我应该看看任何其他排序算法?

2 个答案:

答案 0 :(得分:6)

只要您具有getval(index)setval(index, value)的等效值,几乎任何排序算法(包括快速排序)都可以使用。

但是,您无法使用标准库中的qsort,因为这需要连续的数据。因此,您必须编写自己的排序函数或引入间接级别,例如:通过创建索引数组,使用qsort对其进行排序,然后将索引的重新排序应用于基础数组存储。

答案 1 :(得分:1)

qsort不适合您的问题,因为它需要一系列元素。您可以使用它来对每个子数组进行排序,但是您仍然需要一种方法在向量结构中合并这些子数组。 radix排序也不直接适用。

除了上述和效率低得多的方法(如插入和冒泡排序)之外,最有效的排序方法还需要一些与数据集大小成比例的额外空间。如果要分配可能大量的空间,最简单的方法似乎是分配一个单独的数组,将内容复制到它,使用radix_sort,qsort或任何其他方法对其进行排序,并将已排序的内容复制回原始的向量结构。