package com.interview.sort; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Map; /** * http://www.geeksforgeeks.org/sort-elements-by-frequency/ */ public class SortArrayByFrequence { class SortNode{ int count; int firstIndex; } class FrequenceComparator implements Comparator<Integer>{ private Map<Integer,SortNode> countMap = null; FrequenceComparator(Map<Integer,SortNode> countMap){ this.countMap = countMap; } @Override public int compare(Integer i1, Integer i2) { SortNode n1 = countMap.get(i1); SortNode n2 = countMap.get(i2); if(n1.count > n2.count){ return -1; }else if(n1.count < n2.count){ return 1; }else{ return n1.firstIndex < n2.firstIndex ? -1 : 1; } } } public void sortByFrequence(Integer arr[]){ Map<Integer,SortNode> countMap = new HashMap<Integer,SortNode>(); int index = 0; for(int a : arr){ if(countMap.containsKey(a)){ SortNode s = countMap.get(a); s.count++; }else{ SortNode s = new SortNode(); s.count = 1; s.firstIndex = index; countMap.put(a, s); } index++; } FrequenceComparator freqComparator = new FrequenceComparator(countMap); Arrays.sort(arr,freqComparator); } public static void main(String args[]){ Integer input[] = {5,2,8,9,9,9,2}; SortArrayByFrequence saf = new SortArrayByFrequence(); saf.sortByFrequence(input); for(int i : input){ System.out.println(i + " "); } } }