【问题标题】:How to use a for loop index outside of for loop in C (selection sort)如何在 C 中的 for 循环之外使用 for 循环索引(选择排序)
【发布时间】:2018-01-07 07:19:15
【问题描述】:

我正在尝试进行选择排序,其中我正在遍历整数列表,挑选出最小的数字,并将其与列表中较早的更大数字交换。这段代码只是在练习一个由 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;    

    }
}    

【问题讨论】:

  • 您可以记住 j 在另一个变量中,例如 minimum_j = j,其中 int minimum_j 在函数范围内定义。或i 或其他。
  • int minimum = values[i]; --> int min_i = i; 喜欢this

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


【解决方案1】:

您需要添加一个变量minimumIndex,它是最小值的索引。当您更新minimum 的值时将其设置为j,它将在循环结束时为您提供最小值的索引。还要用正确的值初始化它:由于mimimum被初始化为values[i]minimumIndex应该被初始化为i

还请注意,您有一个错误:您从j=1 开始内部循环,但它应该以ii+1 开始,以便您跳过已经放置的元素。

【讨论】:

  • 非常感谢,这很有道理。
  • 能否请您澄清如何/为什么将 minimumIndex 初始化为 i?当我第一次声明变量时,我将它设置为等于 i?如果我不这样做,当设置最小值时,初始化值不会被更新的索引覆盖吗?
  • @Josh 你将minimum 初始化为values[i]。如果这实际上是最小值,那么 if 条件将永远不会为真,因此您希望 minimumIndexi
【解决方案2】:

只保留元素的索引最小值。例如

#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++ )
                 ^^^^^

【讨论】:

  • 非常感谢您抽出宝贵的时间阅读,非常感谢。
  • 我能问你为什么要创建数据类型 size_t 吗?我以前没见过这个,只使用 int 数据类型就足够了吗?
  • @Josh size_t 是一个整数类型,通常定义为 unsigned long 类型的别名。此类型由运算符 sizeof 和头文件 中声明的字符串函数使用,例如函数 strlen。问题是数组可能太大,以至于 int 类型无法存储此类数组的所有索引。
猜你喜欢
  • 2018-09-19
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
相关资源
最近更新 更多