我有一个整数向量。向量的大小约为2k,向量中的每个数字都在[0,2M]的范围内,很可能为0。
由于它是稀疏向量,我想知道是否有比常规算法更好的算法来对向量进行排序?哪种排序算法最适合这种情况?
由于
答案 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),+我认为几乎每种编程语言都有一种实现方式。