trier le tableau dans l'ordre décroissant de fréquence d'apparition des éléments dans le C

Question est de trier le tableau en fonction de la fréquence
des éléments. Par exemple, si le tableau d'entrée est

   { 2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12 }

puis modifier le tableau:

   { 3, 3, 3, 3, 2, 2, 2, 12, 12, 4, 5 }

J'ai écrit le code et il fonctionne correctement, mais c'est à l'aide de beaucoup d'espace et possède une très grande complexité.

Je ne suis pas satisfait de cette solution et de la logique, j'ai postulé pour ce. Si quelqu'un aider à optimiser ce code ou de fournir une meilleure logique.

Mon Code est:

#define _CRT_SECURE_NO_WARNINGS //this line to work code in visual studio
#include <stdio.h>
int main() {
/*
* n = number of integer
* i = loop variable
* j = inner loop variable
* c = number of distinct input
* buf = temprary storage for input value
* k = possibility of frequency of any no.
*/
int n, i, j, c = 0, buf, k;
int b; //act as flag
int arr[100] = { 0 };
int stack[200] = { 0 };
int top = -1;
printf("Enter the size of array(integer between 1-100):");
scanf("%d", &n);
n *= 2;
printf("----------Enter the elements in the array----------\n\n");
for (i = 0; i < n; i += 2) {
b = 0;
printf("Enter the element:");
scanf("%d", &buf);
for (j = 0; j <= i; j += 2) {
if (arr[j] == buf) {
arr[j + 1]++;
b = 1;
}       
}
if (b == 0) {
c++;
arr[c * 2 - 2] = buf;
arr[c * 2 - 1]++;
}
}
for (i = 0; i < c * 2; i++)
printf("%d ", arr[i]);
//input done in form of (element,times of occurence i.e. frequency),to print array, write this outside of comment: 
//for (i = 0; i < c * 2; i++) printf("%d ", arr[i]);
for (k = 1; k < n / 2; k++) {   //checking for possible frequencies
for (j = c * 2 - 1; j > 0; j -= 2) {
//locations(index) to check in array for frequency
//left to right, so with same frequency no.,which occurred first will push in last.
if (arr[j] == k)
stack[++top] = j; //pushing(index of frequency) into stack in increasing order of frequency     
}
}
//to print stack, write this outside of comment:
//printf("\nstack\n");
//for (i = top; i > -1; i--) printf("%d ",stack[i]);
//printing of elements in there decreasing order of frequency(pop from stack)
//we have to print element, number of times of its frequency
printf("\n\n----------Output array in sorted order of there frequency----------\n");
for (top; top > -1; top--) {        
for (j = arr[stack[top]]; j > 0; j--)
printf("%d ", arr[stack[top] - 1]);
}
}
Êtes-vous limité à C seulement? Si C++ est permis, où vous pouvez utiliser std::map et qsort, vous pouvez le faire en 15 lignes de code
Lire: Trier les éléments en fonction de la fréquence | Set 2
oui, parce que je ne sais pas c++ à tous... mais vous pouvez sugest avec le c++ pour les autres.. bt je vais définitivement pas capable de comprendre ça..
Vous pouvez choisir une technique de cette réponse Comment organiser un tableau dans l'ordre décroissant de la fréquence de chaque numéro?
J'ai essayé d'utiliser std::map et paire et ne pouvait pas faire moins de 17 lignes 🙂

OriginalL'auteur Nit kt | 2013-10-02