1
votes

Pourquoi mon SelectionSort ne fonctionne pas toujours?

Je suis débutant et j'essaye maintenant pour le deuxième jour d'implémenter SelectionSort à des fins de pratique. L'algorithme que j'ai fonctionne la plupart du temps mais pas toujours. Malheureusement, je ne comprends pas du tout pourquoi cela ne fonctionne pas toujours. L'exemple en est un où cela ne fonctionne pas.

#include <stdio.h>

int* selectionSort(int a_count, int *a);

int main(void)
{
    int a[] =     {4,2,3,4,4,9,98,98,3,3,3,4,2,98,1,98,98,1,1,4,98,2,98,3,9,9,3,1,4,1,98,9,9,2,9,4,2,2,9,98,4,98,1,3,4,9,1,98,98,4,2,3,98,98,1,99,9,98,98,3,98,98,4,98,2,98,4,2,1,1,9,2,4};
    int i, a_count = 73;
    int *result = selectionSort(a_count, a);
        for(i = 0; i < a_count; i++){
            printf("%i ", result[i]);
        }
    return 0;
}   

int* selectionSort(int a_count, int* a) {
    int i, j, min = 0, tmp;
    for(i = 0; i < a_count - 1; i++){
        min = i;
        printf("min_i = %i\n", min);
        for(j = i + 1; j < a_count; j++){
            printf("j = %i ", j);
                if(a[j] < a[min]){
                printf("%i < %i\n", a[j], a[min]);
                printf("min is changed: ");
                min = j;
                printf("min_j = %i\n", min);
            }
            tmp = a[i];
            a[i] = a[min];
            a[min] = tmp;
        }
   }
   return a;
}

Merci beaucoup pour votre aide!


2 commentaires

Est-ce toujours le même résultat pour les mêmes données? Ou un ensemble de données ne fonctionne-t-il pas toujours?


@WeatherVane Il semble que ce soit toujours la même chose.


4 Réponses :


0
votes

Vous échangez l'élément i avec l'élément min à chaque itération de votre boucle sur j . C'est à la fois incorrect et inefficace. Effectuez l'échange une fois la boucle interne terminée, de sorte que min contienne en fait l'index de la valeur minimale du sous-tableau actuel, pas pendant que vous essayez toujours de déterminer où se trouve cet élément.


0 commentaires

0
votes

Il y a une erreur simple, c'est que vous n'attendez pas la fin de la boucle interne pour faire le swap.

int* selectionSort(int a_count, int* a) {
    int i, j, min = 0, tmp;
    for(i = 0; i < a_count - 1; i++){
        min = i;
        printf("min_i = %i\n", min);
        for(j = i + 1; j < a_count; j++){
            printf("j = %i ", j);
                if(a[j] < a[min]){
                printf("%i < %i\n", a[j], a[min]);
                printf("min is changed: ");
                min = j;
                printf("min_j = %i\n", min);
            }
        }
        tmp = a[i];         //  three lines moved out of the loop
        a[i] = a[min];      //
        a[min] = tmp;       //
   }
   return a;
}

La sortie est maintenant correcte.


0 commentaires

0
votes

Vous avez deux boucles, dans la boucle externe, vous définissez d'abord min, puis dans la boucle interne, le min a changé, ce qui a gâché la valeur min et rend votre code d'échange erroné. Vous pouvez supprimer tout le code sur min, utiliser directement i, j, puis cela devrait fonctionner. changement si (a [j]


0 commentaires

0
votes
public static class SelectionSort
{
    static int min;
    public static void Sort(int[] data)
    {
        for (int i = 0; i < data.Length; i++)
        {
            for (int j = 0; j < data.Length; j++)
            {
                min = j;
                if (data[i] < data[j])
                    Swap(x: ref data[i], y: ref data[min]);
            }
        }
    }

    private static void Swap(ref int x, ref int y)
    {
        int temp = x;
        x = y;
        y = temp;
    }
}

1 commentaires

pouvez-vous donner un peu d'explication?