我在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来对这个向量进行排序吗?如果没有,我应该看看任何其他排序算法?
答案 0 :(得分:6)
只要您具有getval(index)
和setval(index, value)
的等效值,几乎任何排序算法(包括快速排序)都可以使用。
但是,您无法使用标准库中的qsort
,因为这需要连续的数据。因此,您必须编写自己的排序函数或引入间接级别,例如:通过创建索引数组,使用qsort
对其进行排序,然后将索引的重新排序应用于基础数组存储。
答案 1 :(得分:1)
qsort
不适合您的问题,因为它需要一系列元素。您可以使用它来对每个子数组进行排序,但是您仍然需要一种方法在向量结构中合并这些子数组。 radix
排序也不直接适用。
除了上述和效率低得多的方法(如插入和冒泡排序)之外,最有效的排序方法还需要一些与数据集大小成比例的额外空间。如果要分配可能大量的空间,最简单的方法似乎是分配一个单独的数组,将内容复制到它,使用radix_sort,qsort或任何其他方法对其进行排序,并将已排序的内容复制回原始的向量结构。