将未排序的连续字符串数组有效地排序到文件中

时间:2015-06-16 19:34:23

标签: c arrays algorithm performance sorting

我有一个包含无序连续数字的字符串数组(范围从0到n),例如[7a, 1b, 2c, 0d, 6e, 5f, 3g, 4h],我想将这些数字按顺序写入文件。

例如:

0d
1b
2c
3g
4h
5f
6e
7a

字符串长度不一样。

我试图找到一种方法来快速完成并且不占用太多空间。我发现了一种可以在O(n)空间复杂度和O(n)性能方面做到这一点的方法:我创建一个包含n个单元格的数组,并将每个字符串插入到他的单元格编号中。

for (i = 0; i < n; i++)
   sortedArray[originalArray[i]] = originalArray[i]

...类似的东西(创建原始大小的新数组并在一次运行中填充它),然后用另一个for循环将已排序数组的内容写入文件。

但我正在寻找一种更好的方法。

1 个答案:

答案 0 :(得分:3)

假设字符串中的前导数字确实是连续且不重复的,那么您将无法获得比您在问题中描述的方法更好的时间复杂度,或者沿着这些方向的某些方面。它需要与字符串数量成比例的工作空间。

相比之下,

  • 标准合并排序还需要与字符串数量成比例的工作空间(但是如果你小心的话,你可以在问题的方法中获得一半),它有{{1}时间复杂度。可替代地,
  • 快速排序就地排序,平均时间复杂度O(n log n);如果你仔细地实现它,那么在最坏的情况下它只需要O(n log n)工作空间 - 递归版本中每个堆栈帧的常量,或者在非递归版本中容纳许多元素的堆栈。
  • 就地合并排序需要O(log n)工作空间(并且不像快速排序那样需要尽可能多的关注),并且平均时间复杂度为O(log n)。在大多数情况下,它很容易超过大多数其他O(n^2)方法。
  • 插入排序就地排序并需要O(n^2)工作空间,但时间复杂度O(1)。对于小输入尺寸,它很容易理解,易于实现,并且实践速度非常快。

还有很多其他选择,但我认为这些可以合理地代表您的选择。哪一个最适合您的需求取决于您的问题大小的界限,以及您如何权衡空间与速度。如果您的问题规模可能非常大,并且您无法承担O(n^2)空间开销,那么请仔细考虑。如果问题规模确定很小,但空间保护至关重要,那么考虑插入排序。如果高速是重要的,你可以承担太空开销,那么你原来的方法非常有吸引力。