基于频率的排序

时间:2009-11-28 05:28:10

标签: algorithm data-structures

您将获得一个整数数组,并根据
的频率对这些整数进行排序 它们的发生。设计算法并分析其时间复杂度。如果是领带,则较小的 数字应首先出现在排序列表中。

样本输入:3,4,3,2,3,5,4,2,2,1,2
样品输出:1 5 4 3 2

3 个答案:

答案 0 :(得分:3)

如果允许额外空间:检查输入并进行频率分析。把它写在一些哈希表中。这意味着,粗略地说:

for each x in input:
  if x in table:
    ++table[x]
  else
    table.insert(x)

然后,对唯一值进行简单的Quicksort,比较函数考虑频率而不是值本身。

那是:

function freq_compare (x, y):
  return compare(table[x], table[y])

其中compare是频率的数字。

答案 1 :(得分:1)

对数组进行排序,然后我们可以轻松获得数字的频率,因为重复的数字将彼此相邻放置。当您获得数字的频率时,将其插入地图中,其中键作为频率,值作为数字。由于map以排序顺序存储键,因此我们可以迭代映射以获得结果。

答案 2 :(得分:0)

首先制作HashMap,将数组元素作为键,将频率作为值。 使用Comparator根据键和值对它们进行排序。

import java.io.*;
import java.util.*;
import java.lang.*;
public class Sum_of
{
 public static HashMap<Integer, Integer> sortHashMapByValues(
    HashMap<Integer, Integer> passedMap) {
List<Integer> mapKeys = new ArrayList<>(passedMap.keySet());
List<Integer> mapValues = new ArrayList<>(passedMap.values());
Collections.sort(mapValues);
Collections.sort(mapKeys);

LinkedHashMap<Integer, Integer> sortedMap =
    new LinkedHashMap<>();

Iterator<Integer> valueIt = mapValues.iterator();
while (valueIt.hasNext()) {
    Integer val = valueIt.next();
    Iterator<Integer> keyIt = mapKeys.iterator();

    while (keyIt.hasNext()) {
        Integer key = keyIt.next();
        Integer comp1 = passedMap.get(key);
        Integer comp2 = val;

        if (comp1.equals(comp2)) {
            keyIt.remove();
            sortedMap.put(key, val);
            break;
        }
    }
}
return sortedMap;
}
   public static void main(String args[])
    {
      HashMap<Integer,Integer> hs = new HashMap<Integer,Integer>();
      int a[]={3,4,3,2,3,5,4,2,2,1,2};
       int n= a.length;
       int c=0;
       for(int i=0;i<n;i++)
        {
        if(hs.containsKey(a[i]))
        {
            c=hs.get(a[i]);
            hs.put(a[i],c+1);
        }
        else
        hs.put(a[i],1);
    }
     hs=Sum_of.sortHashMapByValues(hs);
    System.out.println(hs.keySet());
      }
 }