java - 对具有许多相等值的数组进行排序java
问题描述
如果我有一个数组,其中近 90% 的值是相等的,我想对它进行排序。我应该使用什么最好的排序方法?
解决方案
如果数组中有很多重复项,则可以使用不同的方法对其进行排序。对于这个 IMO,像 AVL 或红黑树这样的自平衡二叉树将是比任何其他排序算法更好的方法。
这个想法是扩展树节点以具有键数。
class Node {
int key;
Node left, right;
int count; // Added to handle duplicates
// Other tree node info for balancing like height in AVL
}
下面是使用 AVL 树的完整算法。
1) 创建一个空的 AVL 树,并将计数作为附加字段。
2) 遍历输入数组并对每个元素 'arr[i]' 执行以下操作</p>
a) If arr[i] is not present in tree, then insert it and initialize count as 1 b) Else increment its count in tree.
3) 对树进行中序遍历。在做 inorder 时,将每个键的计数时间放在 arr[] 中。
第二步需要O(n Log m)
时间,第三步需要O(n)
时间。所以总体时间复杂度是O(n Log m)
,其中m
是不同元素的数量。
这里给出了详细的解释和实现:Geeks for Geeks
推荐阅读
- javascript - 在表单提交上调用 React 自定义钩子
- javascript - JavaScript:从本地读取 JSON
- amazon-web-services - 使用“for_each”创建的 Terraform 资源 - 在其他 Terraform 脚本中使用
- jquery - 如何仅使用 jQuery 使事件返回首先匹配?
- python - 将输出转换为类似日志文件的输出,直接转换为日志文件
- python - 如何使用整数 id 变量在数据库中搜索?
- java - 运算符 < 未定义参数类型 int,使用 Selenium 和 Java 创建 web 元素列表时出现维度错误
- swift - SwiftUI 将@Published viewmodel 对象值传递给@Binding
- javascript - 如何通过 @mdx-js/loader 使用新的自动反应运行时导入
- java - 我想知道如何将 JComboBox 添加到我的 JTable