Java 字符串排序和字符串比较之间的区别是什么。它们不是和我们为了排序而必须比较字符串一样吗?

Java 字符串排序和字符串比较之间的区别是什么。它们不是和我们为了排序而必须比较字符串一样吗?,java,algorithm,sorting,comparison,big-o,Java,Algorithm,Sorting,Comparison,Big O,假设我们有一个算法,它接收一个字符串数组,对每个字符串进行排序,然后对整个数组进行排序。运行时是什么 我对解决方案有点困惑 在第三行,它写入的对每个字符串的排序是O(s log s), 在第5行,写入的每个字符串比较需要0(s)个时间。 据我所知,即使要对字符串进行排序,我们也必须首先比较它,所以它们不是同一件事。为什么运行时不同 • Let S be the length of the longest string. • Let a be the length of the array. No

假设我们有一个算法,它接收一个字符串数组,对每个字符串进行排序,然后对整个数组进行排序。运行时是什么

我对解决方案有点困惑 在第三行,它写入的
对每个字符串的排序是O(s log s),
在第5行,写入的
每个字符串比较需要0(s)个时间。
据我所知,即使要对字符串进行排序,我们也必须首先比较它,所以它们不是同一件事。为什么运行时不同

• Let S be the length of the longest string.
• Let a be the length of the array.
Now we can work through this in parts:
• Sorting each string isO(s lo g s),
• We have to do this for every string (and there are a strings), so that's 0( a* s lo g s).
• Now we have to sort all the strings. There a re a strings, so you'll may be inclined to say that this takes 0( a
l o g a) time. This is what most candidates would say. You should also take into account that you need
to compare the strings. Each string comparison takes 0(s ) time.There are 0( a lo g a) comparisons,
therefore this will takeO(a* s lo g a)time .
If you add up these two parts, you get 0(a*s ( lo g a + lo g s)) . 

运行时是不同的,因为为了进行排序,您需要多次重新访问数组的元素,将其与其他元素进行比较,并找出它的正确位置。 请看下面我无耻地从维基百科上摘取的quick short动画,第一个元素被重新访问了三次


但在比较中,比较第0个元素,然后比较第1个元素。。。第n个元素来计算差异

一步一步来

比较 让我们比较两个字符串。要完成比较(在最坏的情况下),需要将一个字符串的每个字母与另一个字符串的每个字母进行比较。这里的复杂性是O(s),其中s是字符串的长度(考虑到它们的长度相等)

分类 现在,取一个字符串并尝试对其进行排序,要对字符串进行排序,长度为N的字符串的每个字母都需要与同一字符串的其余(N-1)个字母进行比较。因此,对于一个字母,您需要进行N-1比较。如果你继续这样做,你会做(N-1)+(N-2)(因为我们之前已经对1个字符进行了排序)+(N-3)+。。。1.全部比较。请注意,这是N个自然数的总和,约等于N(N+1)/2=>因此复杂性为O(N^2)

像快速排序、合并排序等算法倾向于对此解决方案进行优化,使其降到O(N log N)

回到你的问题上来

在第5行,写入的每个字符串比较需要0(s)时间。 这是因为,在对单个字符串排序时,对单个字母的比较只需要O(1)(比较一个字母表和另一个字母表)
这里,您正在对一个长度为S的字符串数组进行排序(因此您需要对长度为S的两个字符串进行比较),而不是O(1)

这里有两件事情需要排序:首先,对每个字符串进行排序。我认为这意味着字符串的字符是按顺序排列的。为此,我们不需要比较字符串,我们需要比较字符。比较两个字符是O(1),所以对单个字符串进行排序是O(s log s)(其中s是字符串的长度),我们必须重复一次

然后,我们对排序后的字符串数组进行排序。为此,我们需要比较字符串。两个字符串只能在最后一个字符中不同,因此我们必须扫描字符串以比较它们。这意味着比较两个字符串是O(s)(其中s是字符串的长度)。我们有O(a loga)比较,所以将这两个值相乘,就可以得到O(s*a loga)的复杂度来对字符串数组进行排序

将这些复杂性结合在一起,就产生了解决方案的复杂性