【问题标题】:Can quicksort be used with multiple arrays?快速排序可以与多个数组一起使用吗?
【发布时间】:2017-02-05 12:00:53
【问题描述】:

我在 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] 等。

所以,虽然向量可以线性索引,但它不是线性存储。可以调整快速排序来排序这个向量吗?如果没有,我应该看看其他排序算法吗?

【问题讨论】:

  • 您需要自己编写使用您的实现的快速排序。 qsort 仅适用于连续数据。
  • 是的,我在问题中引用了那个确切的点。我知道我必须编写自己的快速排序,问题是这是否是合适的算法。
  • 你能发布你的实现的实际定义和 API 吗?根据细节,某些排序算法可能比其他算法更合适。对于整数数组,基数排序非常有效。

标签: c arrays sorting


【解决方案1】:

只要你有 getval(index)setval(index, value) 的等价物,几乎任何排序算法(包括快速排序)都可以工作。

但是,您不能使用标准库中的qsort,因为这需要连续的数据。因此,您必须编写自己的排序函数或引入间接级别,例如通过创建一个索引数组,使用qsort对其进行排序,然后将生成的索引重新排序应用到底层数组存储。

【讨论】:

  • 这就是我所需要知道的。谢谢!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 2015-07-21
    • 1970-01-01
    • 2013-08-25
    • 2020-05-29
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多