Почему моя SelectionSort не всегда работает? - PullRequest
1 голос
/ 11 марта 2019

Я новичок и сейчас пытаюсь второй день реализовать SelectionSort для практических целей.Алгоритм у меня работает в большинстве случаев, но не всегда.К сожалению, мне совершенно непонятно, почему это не всегда работает.Пример один, где это не работает.

#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;
}

Большое спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 11 марта 2019

Существует простая ошибка, заключающаяся в том, что вы не дожидаетесь конца внутреннего цикла, чтобы выполнить обмен.

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;
}

Теперь вывод правильный.

0 голосов
/ 11 марта 2019

У вас есть два цикла, во внешнем цикле вы сначала задаете min, затем во внутреннем цикле изменилось min, что испортило значение min и сделало ваш код подкачки неверным. Вы можете удалить весь код около min, использовать i, j напрямую, тогда должно сработать. менять если (a [j]

0 голосов
/ 11 марта 2019

Вы меняете элемент i с элементом min на каждой итерации цикла по j. Это неверно и неэффективно. Выполните обмен после завершения внутреннего цикла, чтобы min фактически содержал индекс минимального значения текущего подмассива, а не пытался выяснить, где находится этот элемент.

...