这种排序方法的名称是啥,它是如何工作的,它与 Arrays.sort() 相比如何?
Posted
技术标签:
【中文标题】这种排序方法的名称是啥,它是如何工作的,它与 Arrays.sort() 相比如何?【英文标题】:What is the name of this sorting method, how does it work and how does it compare to Arrays.sort()?这种排序方法的名称是什么,它是如何工作的,它与 Arrays.sort() 相比如何? 【发布时间】:2020-05-23 09:44:41 【问题描述】:Q#1
我正在寻找一种按升序顺序对数组进行排序的方法。我发现了这个并且它有效,但我不明白它是如何工作的。
Q#2
对于大 O 表示法,哪种方法更好(n
在我的情况下会很小),下面的方法还是Arrays.sort()
?
for (int i = 0; i < array; i++)
for (int j = 0; j < array; j++)
if (arr[i] < arr[j])
order = arr[j];
arr[j] = arr[i];
arr[i] = order;
注意:array
等于 arr.length
。
【问题讨论】:
您确定您的意思不是:“...以 descending 顺序对数组进行排序...”? 欢迎来到 *** 社区!你能用你使用的语言标记帖子吗?这样可以更轻松地查找和回答问题。 @JanezKuhar 是的,我已经尝试过这两种方式都是为了从小到大提升你能告诉我它是如何工作的。因为我正在努力做到这一点 @GhostCat 感谢您的提示,我现在正在阅读有关排序气泡和插入的信息。现在最好有 Arrays,sort() 还是在上面。因为即使这种方法是 o(n^2) 它在测量纳秒时更快,这就是我想知道的原因。 【参考方案1】:#1
您使用的方法最接近所谓的Selection Sort。 here 可以找到一个很好的插图,here 可以找到一个更有趣的插图。
选择排序的正确实现将从j = i + 1
开始内部循环,并且每次外部循环迭代最多交换一个元素(最小值或最大值 数组的未排序部分中的元素与i-th
元素)。就目前而言,数组仍然可以正确排序,但是您正在进行大量冗余比较和交换。
另请注意,您的 if
逻辑按 降序 顺序(而不是像您声称的那样按 升序)对数组进行排序。
#2
选择排序的时间复杂度为O(n^2)
,而Arrays.sort()
使用Dual Pivot Quicksort 的时间复杂度为O(nlogn)
。 JDK 的排序算法还内置了一个优化,它在较小的数组上使用插入排序,因此您确实没有理由担心性能。
编辑:为什么使用这种方法比使用Arrays.sort()
排序时间更快?
而API docs 状态:
实施说明:
排序算法是 Dual-Pivot Quicksort...
actual implementation 涉及更多,包含各种优化。
当然,在特定情况下您的排序方法可能更快,但我会坚持使用 JDK 的排序算法。它已经过彻底的测试和改进,以确保正确性和最佳性能。
正如@GhostCat 所指出的,另一件需要考虑的事情是,您的基准测试可能存在缺陷。有关该主题的更多信息,请查看How do I write a correct micro-benchmark in Java?。
【讨论】:
我想知道,因为在上面的方法中,它给我的时间比 Arrays,sort() 少。无论如何,感谢您回答第二个问题,我会投票给您,但积分不多。 @JanezKuhar 是的,现在好多了,谢谢。奇怪的是,arrays.sort 在 array.sort 中花费的时间比在 nanoTime 中 array.sort 在 nano 中花费了 282300,在这个方法中花费了 60200 所以我想知道这是否与大 O以上是关于这种排序方法的名称是啥,它是如何工作的,它与 Arrays.sort() 相比如何?的主要内容,如果未能解决你的问题,请参考以下文章
Javascript中这种表达式的名称是啥? obj[s] = ++obj[s] || 1