c - 什么算法可以在线性时间内对新值和重复值进行排序,而不使用额外的空间?

标签 c arrays algorithm sorting

[7,1,2,3,2,4,1,5,6]

什么算法可以在线性时间内对新值和重复值进行排序,而不使用额外的空间?

据我所知,计数排序对唯一值进行排序,其他比较排序都不是 O(n)。

最佳答案

你的问题并不是很恰当,因为计数排序的问题不在于它不对重复值进行排序(它对它们进行很好的排序,这就是为什么它是“计数排序”而不是“标志设置排序” "),而是(正如 babon 上面指出的那样)计数排序至少需要 O(k) 额外空间,其中 k 是数组中不同值的数量.

但是先把这个放在一边。 。 。如果这些是有限大小的整数(例如 32 位整数),您可以使用 American flag sort ,它是基数排序的就地变体。假设您想要最少的额外空间(您说“没有额外空间”,但这是不可能的,因为即使单个索引变量 i 也构成“额外空间”),您可以按如下方式进行:

  • 首先,将小于0的元素划分在大于或等于0的元素之前。 (您可以按照与 segregate even and odd numbers 相同的方式执行此操作,只不过使用 & 0x8000 而不是 % 2。)
  • 接下来,在第一个(小于 0)分区中,将小于 0xC000 的元素划分在大于或等于它的元素之前;在第二个(大于或等于0)分区中,将小于0x4000的元素划分在大于或等于的元素之前到0x4000。 (您可以使用与上一步相同的方法,只不过您还需要留意何时从一个分区转换到另一个分区。)
  • 并且,对于每个后续位也是如此。

总的来说,这涉及到数组的 32 次传递(如果这些是 32 位整数),所以它的时间复杂度为 O(32n) = O(n)。

关于c - 什么算法可以在线性时间内对新值和重复值进行排序,而不使用额外的空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42323275/

相关文章:

c - 串口读取未完成

c++ - 在 C 代码中使用 C++ 库

php - 支持 Unicode 的 PHP 中的自然排序算法?

php - 无法解决带有变体的php算法

algorithm - 什么是s2k算法?

c - 静态库是否应该始终使用与应用程序相同的编译器选项来构建?

arrays - 使用 realloc() 进行无效插入

php - 从数组中获取指定行

java - 如何在 Java 中创建一个包含字符串、字符串数组和 int 数组的对象?

algorithm - 给定游戏的获胜者