使用字节比较对结构进行排序的最佳排序算法?

时间:2011-01-23 17:25:57

标签: c++ arrays sorting struct

我有一个由64个结构组成的数组,它们包含大量数据(结构大约是128个字节,因此需要重新分区的是8192个字节)。需要根据每个结构中的单个无符号字节对数组进行排序。我的数据的一个有趣的属性是很可能会有很多重复的排序值 - 这意味着如果你摆脱了所有的重复,那么数组可能只有10个独特的元素,但这不是给定的。

一旦排序,我需要创建一个堆栈来存储每个唯一字节运行开始的大小和类型: 所以,如果我最终得到排序值: 4,4,4,9,9,9,9,9,14,14 堆栈将是: (4,3),(9,5),(14,2)

我认为在这些条件下我可以进行一些很好的优化。如果我做了heapsort,我可以在排序的同时创建堆栈,但这会比qsort更快然后构建堆栈吗?由于我正在使用的大型结构,任何排序算法会运行得更慢吗?我可以进行任何优化,因为我只是比较字节?

BTW:语言是c ++

感谢。

4 个答案:

答案 0 :(得分:2)

我会想象STL会做你想要的。重写自己的排序例程和容器可能容易出错,而且速度很慢。所以只要担心你是否发现它是一个瓶颈。

答案 1 :(得分:2)

通常对于大对象,可以更快地对对象的指针/索引数组进行排序,而不是对象。或者对节点数组进行排序,其中每个节点包含对象的指针/索引和对象的排序键(在这种情况下,键是一个字节)。要在C ++中执行此操作,您只需向std::sortstd::stable_sort提供合适的比较器即可。然后,如果您需要按顺序原始对象,而不是只需要知道正确的顺序,最后将对象复制到一个新数组中。

复制128个字节几乎肯定比执行字节比较慢得多,即使有额外的间接也是如此。因此,为了获得最佳性能,您需要查看的是移动,而不是比较,并且处理指针是避免大部分移动的一种方法。

您可以在最后执行复制时构建运行长度编码。

当然,使用一些自定义排序算法可能会更快,在你的情况下特殊使用数字(64,“大约128”和1)。但是,如果没有编写和运行代码,即使是“最快 - 内省,堆排序或合并排序”这样的简单问题通常也无法回答。

答案 2 :(得分:1)

排序不会慢,因为您将排序指针或对结构的引用,而不是内存中的实际结构。

答案 3 :(得分:0)

你的密钥是整数,而且确实没有很多, 赔率是Bucket Sort,桶大小为1,非常适用。