我正在尝试进行选择排序,我将查看整数列表,选出最小的数字,然后在列表中更早的数字中使用更大的数字进行交换。这段代码只是用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;
}
}
答案 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++ )
^^^^^