programming-examples/ruby/Arrays/SortArrayByFrequency.rb
2019-11-15 12:59:38 +01:00

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]