C 什么算法在线性时间内不使用额外空间对新值和重复值进行排序?
[7,1,2,3,2,4,1,5,6] 什么算法在线性时间内不使用额外空间对新值和重复值进行排序C 什么算法在线性时间内不使用额外空间对新值和重复值进行排序?,c,arrays,algorithm,sorting,C,Arrays,Algorithm,Sorting,[7,1,2,3,2,4,1,5,6] 什么算法在线性时间内不使用额外空间对新值和重复值进行排序 据我所知,计数排序对唯一值进行排序,而其他比较排序没有启用。你的问题不是很好,因为计数排序的问题不是它没有对重复值进行排序,而是对它们进行了很好的排序,这就是为什么它是计数排序而不是设置标记排序,但正如上面指出的,计数排序至少需要额外的Ok空间,其中k是数组中不同值的数目 但抛开这一点不谈。如果这些是有限大小的整数,例如32位整数,则可以使用,这是基数排序的一个就地变量。假设您想要最小数量的额外空间
据我所知,计数排序对唯一值进行排序,而其他比较排序没有启用。你的问题不是很好,因为计数排序的问题不是它没有对重复值进行排序,而是对它们进行了很好的排序,这就是为什么它是计数排序而不是设置标记排序,但正如上面指出的,计数排序至少需要额外的Ok空间,其中k是数组中不同值的数目 但抛开这一点不谈。如果这些是有限大小的整数,例如32位整数,则可以使用,这是基数排序的一个就地变量。假设您想要最小数量的额外空间,您会说没有额外空间,但这是不可能的,因为即使一个索引变量i构成额外空间,您也可以按如下方式进行: 首先,将小于0的元素划分为大于或等于0的元素之前的元素。除了使用&0x8000而不是%2之外,您可以使用与您相同的方法来执行此操作。 接下来,在第一个小于0的分区内,将小于0xC000的元素划分为大于或等于0xC000的元素之前的元素;在第二个大于或等于0的分区中,在大于或等于0x4000的元素之前对小于0x4000的元素进行分区。您可以使用与上一步相同的方法进行此操作,只是您还需要注意从一个分区转换到另一个分区的时间。 并且,对于每个后续位也是如此。
总的来说,如果这些是32位整数,则需要32次通过数组,因此它是O32n=On。我不明白您要的是什么。在什么意义上不排序重复值?也许可以为您的示例发布预期结果?我读到计数排序使用值作为索引进行排序。这就是我猜的原因@如果你认为这是错误的,那么我将再次阅读计数排序。计数排序对这一点很好,因为它在最佳、平均和最坏情况下都有On+k时间。我还建议使用一个哈希表来计算数字的频率,然后对哈希表进行排序,然后用这些排序后的值替换数组。@RoadRunner前面提到的OP没有使用额外的空间。AFAIK计数排序确实使用额外的空间来构建哈希表。计数排序计算的是重复值。但正如巴本所说,它需要额外的存储来保存计数。