Почему сортировка выбора не выполняется, когда я жестко кодирую ненулевое минимальное значение? - PullRequest
2 голосов
/ 18 февраля 2020

Мой код не выполняет сортировку выбора успешно, когда я задаю min = arr[0] перед вводом l oop для обработки массива, он завершается неудачно.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int arr[11] = {7, 12, 4, 28, 3, 15, 7, 3, 89, 1, 12};
    int x, i, next_index;

    /* Select first element (i = 0) first for loop and compare it with all  
       elements of array till the end of array second for loop (so next   
       iteration, when i = 1 the first element will be the smallest one */

    for (i = 0; i <= 10; i++)
    {   
        // min = arr[0]; /* <-- WHEN I UNCOMMENT THIS THE CODE FAILS. WHY? */

        /* Select min element */
        for (next_index = i + 1; next_index <= 10; next_index++)
        {     
            if (arr[next_index] < arr[i])
            {   
                 /* Swap arr[i] with min value */
                 x = arr[i];
                 arr[i] = arr[next_index];
                 arr[next_index] = x;
            }
        }
     }
     printf("Sorted array: \n");

     for (i = 0; i <= 10; i++)
        printf(" %d \n", arr[i]); 

     return 0;
}

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Для начала оба подхода неэффективны, поскольку имеются избыточные перестановки элементов массива.

Во второй программе вместо использования в теле внешнего l oop оператора

min=arr[i];

вы используете

min=arr[0];

В этом l oop

printf("sorting array is : \n");
       for(i=0;i<=10;i++)
           {
    printf(" %d \n",min); // as i put value of min in i
           } 

вы всегда выводите последнее значение переменной min вне циклов, которые сортируют массив. , Также не рекомендуется использовать магические числа c, такие как 10.

. И объявлять переменные в наименьшей области, где они используются.

Программа может выглядеть следующим образом way

#include <stdio.h>

int main( void )
{
    int arr[] = { 7, 12, 4, 28, 3, 15, 7, 3, 89, 1, 12 };
    const size_t N = sizeof( arr ) / sizeof( *arr );    

    printf( "Unsorted array: " );
    for ( size_t  i = 0; i < N; i++ )
    {
        printf(" %2d ", arr[i] );
    }
    putchar( '\n' );


    for ( size_t i = 0; i < N; i++ )
    {   
        size_t min_i = i; 

        for ( size_t j = i + 1; j < N; j++ )
        {     
            if ( arr[j] < arr[min_i] ) min_i = j;
        }

        if ( min_i != i )
        {
            int tmp = arr[i];
            arr[i] = arr[min_i];
            arr[min_i] = tmp;
        }
    }

    printf( "sorted array:   " );
    for ( size_t  i = 0; i < N; i++ )
    {
        printf(" %2d ", arr[i] );
    }
    putchar( '\n' );

    return 0;
} 

Его вывод

Unsorted array:   7  12   4  28   3  15   7   3  89   1  12 
sorted array:     1   3   3   4   7   7  12  12  15  28  89 
1 голос
/ 18 февраля 2020

Второй код работает неправильно, потому что вы не меняете значения правильно. Во-вторых, логика c назначения min = arr [0] не будет работать, это логически неправильно. Возможно, вам придется сделать как min = arr [i] и правильно поменять значения.

...