当我硬编码一个非零最小值时,为什么我的选择排序会失败?

Why does my selection sort fail when I hardcode a non-zero minimum value?

当我在进入循环处理数组之前指定 min = arr[0] 时,我的代码没有成功执行选择排序,它失败了。

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

第二个代码无法正常工作,因为您没有正确交换值。其次,赋值 min = arr[0] 的逻辑是行不通的,逻辑上是错误的。您可能需要像 min = arr[i] 这样正确地交换值。

对于初学者来说,这两种方法都是低效的,因为存在数组元素的冗余交换。

在第二个程序中而不是在外循环体中使用语句

min=arr[i];

您正在使用

min=arr[0];

在这个循环中

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

您总是在对数组进行排序的循环之外输出变量 min 的最后一个值。 . 使用像 10.

这样的幻数也是一个坏主意

并且您应该在使用它们的最小范围内声明变量。

程序可以这样看

#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