如何在C中使用for循环外的for循环索引(选择排序)

时间:2017-07-31 16:07:19

标签: c sorting for-loop nested selection-sort

我正在尝试进行选择排序,我将查看整数列表,选出最小的数字,然后在列表中更早的数字中使用更大的数字进行交换。这段代码只是用4个整数的短串来练习。我正在努力的是通过整个整数列表找到最小的数字,然后继续前进。我发现这很有用,就像它自己的嵌套for循环一样,但是我无法记住'在尝试交换整数时,最小数字处于哪个索引(这将是被注释掉的代码行,因为它不知道' j'是什么)。如果我尝试在for循环中执行此操作,那么在查看是否存在任何其他较小的整数之前,我过早地交换小于我交换的第一个整数。任何正确方向的提示都将非常感激。谢谢!

int main (void)
{

    int tmp;
    int n = 4;
    int values[] = {5,3,4,1};



    for (int i=0; i < n; i++)
    {    
        int minimum = values[i];

        for (int j=1; j < n; j++)
        {
            if (values[j]<minimum)
            {   
                minimum=values[j];
            }

        }

        tmp = values[i];
        values[i] = minimum;
        //values[j] = tmp;    

    }
}    

2 个答案:

答案 0 :(得分:0)

您需要添加变量minimumIndex,它是最小值的索引。更新j的值时将其设置为minimum,它将为您提供循环结束时最小值的索引。还要使用正确的值对其进行初始化:由于mimimum已初始化为values[i],因此minimumIndex应初始化为i

另请注意,您有一个错误:您在j=1开始内循环,但它应该以{{1​​}}或i开头,以便您跳过已经存在的元素放置。

答案 1 :(得分:0)

保持元素的索引具有最小值。例如

#include <stdio.h>

int main ( void )
{
    int values[] = { 5, 3, 4, 1 };
    size_t n = sizeof( values ) / sizeof( *values );

    for ( size_t i = 0; i < n; i++ )
    {
        printf( "%d ", values[i] );
    }

    putchar( '\n' );

    for ( size_t i = 0; i < n; i++ )
    {    
        size_t minimum = i;

        for ( size_t j = i + 1; j < n; j++ )
        {
            if ( values[j] < values[minimum] )
            {   
                minimum = j;
            }
        }

        if ( minimum != i )
        {
            int tmp = values[i];
            values[i] = values[minimum];
            values[minimum] = tmp;    
        }
    } 

    for ( size_t i = 0; i < n; i++ )
    {
        printf( "%d ", values[i] );
    }

    putchar( '\n' );
}   

注意内循环的索引应以值i + 1开始。

for ( size_t j = i + 1; j < n; j++ )
                 ^^^^^