Le tri de tableau à deux dimensions en C en se basant uniquement sur la première colonne
J'ai un double-type de tableau avec 2 colonnes et un nombre maximum de lignes de 1000, que j'ai envie de tri basé sur le premier élément de chaque ligne, puis passer l'ensemble de la ligne. En fait, je veux la deuxième colonne de l'élément de n'avoir aucun impact.
Je vous présente la matrice:
double A[1000][2];
dans ma main.
Un exemple pourrait être:
18.0 2.0
5.5 3.5
10.0 8.1
4.0 2.5
Après le tri, je voudrais qu'elle ressemble à ceci:
4.0 2.5
5.5 3.5
10.0 8.1
18.0 2.0
Il serait également bon de savoir comment faire pour avoir un tri dans le sens inverse, de sorte qu'il ressemble à ceci:
18.0 2.0
10.0 8.1
5.5 3.5
4.0 2.5
Remarquez comment il est seulement être classées sur la base de la valeur dans la première colonne, puis l'ensemble de la ligne obtient commuté.
J'ai essayé d'utiliser un assez standard d'insertion algorithme de tri, avec juste changer la source d'entrée argument le tableau à deux dimensions, et d'avoir un bloc de code à l'intérieur de la fonction qui modifie à la fois les éléments de la ligne, mais j'ai continué à obtenir cette erreur:
erreur: le tableau est incomplet élément de type " double []'
sort_double_array(double A[][], int n) {
Comment dois-je faire? Serait agréable d'être en mesure de le faire en utilisant le tri par insertion. Je peux poster la fonction que j'utilise pour le tri par insertion, mais il fonctionne parfaitement pour une dimensions des tableaux.
Merci beaucoup à l'avance, vraiment coincé ici.
Acclamations,
James.
qsort
par écrire de la fonction de comparaison.OriginalL'auteur James Adams | 2014-04-23
Vous devez vous connecter pour publier un commentaire.
Essayer de déclarer à la fonction de
sort_double_array(double A[][2], int n);
Tableau multidimensionnel doit avoir des limites pour toutes les dimensions, sauf la première.
void sort_double_array(double A[][2], int n) { int i, j; for (i=1; i<n; i++) { /*swap A[i] left into correct position */ for (j=i-1; j>=0 && A[j+1]<A[j]; j--) { double_swap(&A[j][0], &A[j+1][0]); double_swap(&A[j][1], &A[j+1][1]); } } }
C'est le bloc de code que j'utilise (insertionsort) à trier les choses. Est-il quelque chose de mal ici? Parce que j'ai implémenté la méthode que vous avez suggéré, et alors qu'il n'a pas renvoyé de toutes les erreurs lors de la compilation, il n'a pas trier le tableau.A[j+1]<A[j] - Cela semble mal - n'êtes-vous pas en comparant les adresses? Où est l'autre indice?
Vous êtes fantastique. C'était un reste de lorsque la fonction a travaillé pour la dimension des tableaux. Merci beaucoup. Simplement ajouté à l' [0]'. Fonctionne parfaitement. Maintenant, comment l'inverser tels qu'il les trie dans l'ordre décroissant, du plus grand nombre à la baisse? Je peux juste flip que l'inégalité signe?
Oui, que devrait faire le travail. N'oubliez pas d'accepter la réponse? 🙂
OriginalL'auteur Prabhu
Essayer de prototypage de votre fonction de tri comme
void sort_double_array(double *A[], int n)
. Pour les points de bonus supplémentaire, utilisezsize_t
plutôt queint
.Avec ce prototype
A
est un tableau de pointeurs qui n'est pas le même comme un pointeur vers un tableau, qui est ce que l'OP veut transmettre.OriginalL'auteur user3553031
Pour ce cas précis, il semble que chaque ligne a un grand sens, il semble être une sorte d'objet? Alors je vous recommande d'oublier le tableau 2D et de le déclarer comme un tableau de structures. La structure devrait ressembler à quelque chose comme:
Et puis vous déclarer un tableau de cette structure:
Maintenant, votre question est rétréci vers le bas à la section "comment trier un tableau de x". Il y a beaucoup d'informations a ce sujet sur le web. Si vous ne voulez pas mettre en œuvre l'algorithme de tri vous-même (ce qui vous permettrait de le faire uniquement pour des fins d'enseignement), je suggère d'utiliser le qsort() fonction dans stdlib.h.
Pour ce qsort qui fonctionne est :
qsort (arr, sizeof(arr)/sizeof(*arr), sizeof(*arr), de moins en moins);
Pour qsort, vous pouvez implémenter la fonction de comparaison utilisée par le tri. Quelque chose comme ceci:
Pour modifier l'ordre de tri, de mettre en œuvre une fonction similaire "plus".
void sort_double_array(double A[][2], int n);
mais je ne pense pas que cela a fonctionné comme prévu. Est-il un moyen facile d'imprimer un tableau que j'ai dans les O. P, pour vérifier que tout va bien? 🙂 Edit: je viens de parcourir le tableau, de sorte que l'impression n'est pas un problème, mais le genre n'est pas passe comme prévu.Vous avez besoin de savoir fondamental C avant d'étudier les algorithmes de tri.
OriginalL'auteur Lundin
OriginalL'auteur nam