35 lines
1.1 KiB
Ruby
35 lines
1.1 KiB
Ruby
|
#Given an array ,sort the array by descending order of count of element,
|
||
|
#if count is same then the element which comes in array first comes first in sorted array.
|
||
|
#Time-complexity: O(nlogn) , Auxiliary-space: O(n) {for hash}
|
||
|
|
||
|
|
||
|
def sort_by_frequency(a)
|
||
|
len=a.length
|
||
|
freq=Hash.new() #Hash to store element,count and starting index
|
||
|
for i in 0...len
|
||
|
# Storing count and index in hash with element as the key
|
||
|
unless freq[a[i]]
|
||
|
freq[a[i]]={}
|
||
|
freq[a[i]][:count]=1
|
||
|
freq[a[i]][:index]=i
|
||
|
else
|
||
|
freq[a[i]][:count]+=1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
freq=freq.sort_by{|k,v| [-v[:count],v[:index]]} # Sort the hash by decreasing count value and if count is same then by index(starting index)
|
||
|
p=0 # Index to iterate over array
|
||
|
# Iterate on hash
|
||
|
freq.each do |k,v|
|
||
|
for i in 0...v[:count]
|
||
|
a[p]=k
|
||
|
p+=1
|
||
|
end
|
||
|
end
|
||
|
return a
|
||
|
end
|
||
|
|
||
|
|
||
|
sort_by_frequency([1,3,3,3,4,4,4,2,2,2,5]) # => [3, 3, 3, 4, 4, 4, 2, 2, 2, 1, 5]
|
||
|
sort_by_frequency([1,3,3,3,4,4,4,2,2,2,5,5,6,7,7,7,8,8]) # => [3, 3, 3, 4, 4, 4, 2, 2, 2, 7, 7, 7, 5, 5, 8, 8, 1, 6]
|