Arrays,sortString []

问题描述

String str[] = {"Hello","World","John","Doe"};
Arrays.sort(str);
System.out.prinltn(Arrays.toString(str));

我知道Arrays.sort(int [])的时间复杂度为O(nlgn)。但是字符串数组呢?由于排序字符串数组在内部使用compareto函数比较两个字符串。它会改变方程式吗?

解决方法

这样说的问题:排序为O(n logn)是因为这是不完整的,因此是模糊的,未定义的语句。目前尚不清楚其含义。问题是:您未能定义n是什么。

现在,实际上,n在上下文中通常很明显。例如,如果我说:“假设最佳排序算法,将整数数组排序为O(n logn)”,那么几乎每个听到此消息的人都会立即意识到,尽管我没有明确说出n显然,我的意思是: n =该数组中整数的数量

所以让我们回到您的问题:现在n不再清楚了。

n是数组中的字符串数吗? n是该数组中所有字符串的平均字符数吗?

我们实际上是在这里谈论2个独立的变量。因此,要用大O表示法正确地描述此问题的性能特征,您应该说:

  • 给出:String[] str,例如:str = {"Hello","World","John","Doe"}
  • nstr数组中的元素数。
  • mstr数组中字符串的平均字符数。
  • 然后,在此数组上调用Arrays.sort(str)将具有O(m * n log n)的性能特征。

之所以为O(m * n logn)的原因是,排序算法本身将运行O(n logn)比较操作以便执行排序。并且每个比较操作都需要O(m)的时间才能完成,尽管那是最糟糕的情况:给定HelloWorld,即使这两个m = 5 ,比较仅需1步即可完成;该算法比较HW并立即回答,甚至从不看elloorld。但是,如果字符串是Hello1Hello2Hello3Hello4,那么每比较2个字符串,就可以保证有5个“步骤”,并且会有{ {1}}比较。