给定一个整数数组,按照元素出现的频率降序对数组进行排序,如果两个元素出现的频率相同则按升序排序
例子:
Input: arr[] = {2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12}
Output: 3 3 3 3 2 2 2 12 12 4 5
Explanation :
No. Freq
2 : 3
3 : 4
4 : 1
5 : 1
12 : 2
Input: arr[] = {4, 4, 2, 2, 2, 2, 3, 3, 1, 1, 6, 7, 5}
Output: 2 2 2 2 1 1 3 3 4 4 5 6 7
以下帖子讨论了不同的方法:
按频率排序元素 |设置 1
按频率排序元素 | 2套
按频率排序数组元素 |设置 3(使用 STL)
按频率排序元素 |设置 4(使用哈希的有效方法)
方法:
这个集合中已经使用了Java Map来解决这个问题。 Java.util.Map 接口表示键和值之间的映射。 Map 接口不是 Collection 接口的子类型。因此,它的行为与其他集合类型略有不同。
在下面的程序中:
- 获取元素及其在 Map 中的计数
- 通过使用 Comparator 接口,比较给定列表中元素的频率。
- 使用此比较器通过实现 Collections.sort() 方法对列表进行排序。
- 打印排序列表。
程序:
import java.util.*;
public class GFG {
// Driver Code
public static void main(String[] args)
{
// Declare and Initialize an array
int[] array = { 4, 4, 2, 2, 2, 2, 3, 3, 1, 1, 6, 7, 5 };
Map map = new HashMap<>();
List outputArray = new ArrayList<>();
// Assign elements and their count in the list and map
for (int current : array) {
int count = map.getOrDefault(current, 0);
map.put(current, count + 1);
outputArray.add(current);
}
// Compare the map by value
SortComparator comp = new SortComparator(map);
// Sort the map using Collections CLass
Collections.sort(outputArray, comp);
// Final Output
for (Integer i : outputArray) {
System.out.print(i + " ");
}
}
}
// Implement Comparator Interface to sort the values
class SortComparator implements Comparator {
private final Map freqMap;
// Assign the specified map
SortComparator(Map tFreqMap)
{
this.freqMap = tFreqMap;
}
// Compare the values
@Override
public int compare(Integer k1, Integer k2)
{
// Compare value by frequency
int freqCompare = freqMap.get(k2).compareTo(freqMap.get(k1));
// Compare value if frequency is equal
int valueCompare = k1.compareTo(k2);
// If frequency is equal, then just compare by value, otherwise -
// compare by the frequency.
if (freqCompare == 0)
return valueCompare;
else
return freqCompare;
}
}
输出:
2 2 2 2 1 1 3 3 4 4 5 6 7
Time Complexity : O(n Log n)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。