Java 中按频率排序元素

10 Sept 2024 | 5 分钟阅读

给定一个整数数组。数组中的一些元素是重复的。我们的任务是返回一个数组或列表,其中包含提供的元素,并按它们出现的频率降序排列。换句话说,出现频率最高的元素应该排在最前面。如果任何两个元素的出现频率相同,则输入数组中先出现的元素应在输出数组中先出现。

示例 1

输入

inputArr[] = {12, 16, 15, 12, 12, 18, 15, 18, 16, 18, 18}

输出

resultArr[] = {18, 18, 18, 18, 12, 12, 12, 16, 16, 15, 15}

解释:元素 18 的出现频率最高,因为它的频率计数为 4。然后,元素 12 的出现频率最高,因为它的频率计数为 3。然后,元素 16 和 15 的频率出现存在平局。由于元素 16 先出现,因此元素 16 排在元素 15 之前。

示例 2

输入

inputArr[] = {19, 20, 17, 45, 34, 3, 2, 1, 89, 56, 80, 85, 90}

输出

resultArr[] = {19, 20, 17, 45, 34, 3, 2, 1, 89, 56, 80, 85, 90}

解释:每个元素的出现频率都相同,即 1。因此,元素在输入数组中的顺序与它们在输出数组中出现的顺序相同。

方法

概念是根据元素出现频率的最高到最低进行排序。为了避免冲突,请根据元素在输入数组中的出现顺序来维护元素的出现索引。

算法

步骤 1:概念是实现自定义比较方法来解决问题。设要比较的两个元素为 'n1' 和 'n2'。那么。

  • 如果 'n1' 和 'n2' 的频率出现不同,则将频率较高的元素放在频率较低的元素之前。
  • 如果 'n1' 和 'n2' 的频率出现相同,则在输入数组中较早出现的元素应放在在输入数组中较晚出现的元素之前。

步骤 2:对于每个元素,将其及其频率和在输入数组中的首次出现索引放入字典中。

步骤 3:根据自定义比较器对元素值进行排序,最终返回具有排列元素的已排序列表。

实施

观察上述算法的实现。

文件名:SortEleByFreq.java

输出

The input array is: 
12 16 15 12 12 18 15 18 16 18 18 
After sorting by frequency of occurrences, the array becomes: 
18 18 18 18 12 12 12 16 16 15 15 
The input array is: 
19 20 17 45 34 3 2 1 89 56 80 85 90 
After sorting by frequency of occurrences, the array becomes: 
19 20 17 45 34 3 2 1 89 56 80 85 90 

复杂度分析:由于我们应用了排序,因此程序的 time complexity 为 O(n * log(n))。我们还创建了一个 array list 来存储结果。因此,space complexity 为 O(n),其中 n 表示输入数组中的总元素数。