如何最快地对稀疏向量进行排序

时间:2013-10-22 19:45:07

标签: algorithm sorting

我有一个整数向量。向量的大小约为2k,向量中的每个数字都在[0,2M]的范围内,很可能为0。

由于它是稀疏向量,我想知道是否有比常规算法更好的算法来对向量进行排序?哪种排序算法最适合这种情况?

由于

4 个答案:

答案 0 :(得分:3)

这个答案可能有点太明显......

由于大多数条目为零,为什么不进行初步交换,以便所有零都在一个 向量的末端和另一个的非零元素。

从两端开始 向量。从一端搜索第一个非零元素,从另一端搜索 第一个零元素。交换它们然后继续直到两个搜索位置相遇。现在,矢量在会合点处被分成两部分。一部分仅包含零元素和其他非零元素。从会合点对非零元素的矢量进行排序。实际上应该很少需要排序的项目。

当排序几十个元素时,所使用的实际排序算法与性能观点没有太大差别(对于六个元素左右,冒泡排序很难被击败!)。

答案 1 :(得分:2)

如果你有2000个元素的向量,不要过分担心如何对它进行排序......它非常小!

也就是说,如果你有一个n个整数的向量,每个都在0和M之间,而M很小,你可以使用Counting sort在O(n)时间内对它进行排序。

如果向量在某个已知范围内有n个实数,且数均匀分布,则可以使用Bucket sort在O(n)预期时间内对它们进行排序。

答案 2 :(得分:1)

您正在描述碰巧有很多0元素的常规密集向量。 稀疏向量仅存储非零元素,如果未存储元素,则假定为0

要对稀疏矢量进行排序,只需对其进行正常排序。 2000已经很小,但是如果你真的使用稀疏结构并且“很可能[元素是0]”那么这个数字会小得多。

稀疏结构的一个示例是vector< pair<int, double> >,其中pair.first是索引,pair.second是值。

答案 3 :(得分:1)

我想到的最好的是Radix Sort,但这比3-way quicksort更难实现。 3向快速排序是最佳的,因为它将跳过许多相同的元素,即O(n * log(n)) - &gt; O(n),+我认为几乎每种编程语言都有一种实现方式。