Sorting Elements of an Array by Frequency
PROBLEM :
Given an array of integers, sort the array according to frequency of elements. For example, if the input array is {2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12}, then modify the array to {3, 3, 3, 3, 2, 2, 2, 12, 12, 4, 5}.
If frequencies of two elements are same, print them in increasing order.
Input:
The first line of input contains an integer T denoting the number of test cases. The description of T test cases follows. The first line of each test case contains a single integer N denoting the size of array. The second line contains N space-separated integers A1, A2, ..., AN denoting the elements of the array.
Output:
Print each sorted array in a seperate line. For each array its numbers should be seperated by space.
Constraints:
1 = T = 70
30 = N = 130
1 = A [ i ] = 60
Example:
Input:
1
5
5 5 4 6 4
Output:
4 4 5 5 6
--------------------------------------------------------------------------------
SIMPLE c++ IMPLEMENTATION :(Using Auxilary arry)
--------------------------------------------------------------------------------
#include<iostream>
using namespace std;
void Array_by_Frequency(int [],int ) ;
int main()
{
int t,no,arr[200],i ;
cin>>t ;
while(t--)
{
cin>>no ;
for(i=0;i<no;i++)
cin>>arr[i] ;
Array_by_Frequency(arr,no) ;
for(i=0;i<no;i++)
cout<<arr[i]<<" " ;
cout<<endl ;
}
return 0;
}
void Array_by_Frequency(int arr[],int no)
{
int i,max,ele,k ;
int hash[200]={0} ;
int b[200] ;
for(i=0;i<no;i++)
hash[arr[i]]++ ;
max=-1 ;
ele=-1 ;
k=0 ;
lable :
for(i=0;i<no;i++)
{
if(hash[arr[i]]>=max)
{
if(hash[arr[i]]==max&&arr[i]<ele)
{
max=hash[arr[i]] ;
ele=arr[i] ;
}
else if(hash[arr[i]]>max)
{
max=hash[arr[i]] ;
ele=arr[i] ;
}
}
}
for(i=k;i<max+k;i++)
b[i]=ele ;
k=i ;
hash[ele]=-1 ;
ele=-1 ;
max=0 ;
if(k<no)
goto lable ;
for(i=0;i<no;i++)
arr[i]=b[i] ;
}
---------------------------------------------------------------------------------
Given an array of integers, sort the array according to frequency of elements. For example, if the input array is {2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12}, then modify the array to {3, 3, 3, 3, 2, 2, 2, 12, 12, 4, 5}.
If frequencies of two elements are same, print them in increasing order.
Input:
The first line of input contains an integer T denoting the number of test cases. The description of T test cases follows. The first line of each test case contains a single integer N denoting the size of array. The second line contains N space-separated integers A1, A2, ..., AN denoting the elements of the array.
Output:
Print each sorted array in a seperate line. For each array its numbers should be seperated by space.
Constraints:
1 = T = 70
30 = N = 130
1 = A [ i ] = 60
Example:
Input:
1
5
5 5 4 6 4
Output:
4 4 5 5 6
--------------------------------------------------------------------------------
SIMPLE c++ IMPLEMENTATION :(Using Auxilary arry)
--------------------------------------------------------------------------------
#include<iostream>
using namespace std;
void Array_by_Frequency(int [],int ) ;
int main()
{
int t,no,arr[200],i ;
cin>>t ;
while(t--)
{
cin>>no ;
for(i=0;i<no;i++)
cin>>arr[i] ;
Array_by_Frequency(arr,no) ;
for(i=0;i<no;i++)
cout<<arr[i]<<" " ;
cout<<endl ;
}
return 0;
}
void Array_by_Frequency(int arr[],int no)
{
int i,max,ele,k ;
int hash[200]={0} ;
int b[200] ;
for(i=0;i<no;i++)
hash[arr[i]]++ ;
max=-1 ;
ele=-1 ;
k=0 ;
lable :
for(i=0;i<no;i++)
{
if(hash[arr[i]]>=max)
{
if(hash[arr[i]]==max&&arr[i]<ele)
{
max=hash[arr[i]] ;
ele=arr[i] ;
}
else if(hash[arr[i]]>max)
{
max=hash[arr[i]] ;
ele=arr[i] ;
}
}
}
for(i=k;i<max+k;i++)
b[i]=ele ;
k=i ;
hash[ele]=-1 ;
ele=-1 ;
max=0 ;
if(k<no)
goto lable ;
for(i=0;i<no;i++)
arr[i]=b[i] ;
}
---------------------------------------------------------------------------------
Comments
Post a Comment