如果我有一个数组,其中近90%的值相等,我想对它进行排序。我应该使用哪种最好的分类方法?
答案 0 :(得分:1)
如果阵列中有多次重复,那么您可以使用不同的方法对其进行排序。对于这个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树,将count作为附加字段。
2)遍历输入数组并对每个元素'arr [i]'
执行以下操作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)按顺序遍历树。在做的时候把每一把钥匙放在上面 在arr []中计算次数。
第二步需要O(n Log m)
次,第三步需要O(n)
次。因此,总体时间复杂度为O(n Log m)
,其中m
是不同元素的数量。
详细说明和实施如下:Geeks for Geeks