我正在尝试打印排序函数的迭代,它似乎有效但有一些额外的数字

I am trying to print iterations of the sorting function, it seems to work but there are some extra numbers

void SelectionSort(int arr[], int n)
{
    int i, j, min_idx;
    // One by one move boundary of unsorted subarray
    for (i = 0; i < n-1; i++)
    {
        // Find the minimum element in unsorted array
        min_idx = i;
        PrintArray(&arr[i], n);
        for (j = i+1; j < n; j++)
            if (arr[j] < arr[min_idx])
                min_idx = j;
            // Swap the found minimum element with the first element
                Swap(&arr[min_idx], &arr[i]);
    }
}
void PrintArray(int arr[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

this is the output I'm getting

我试图打印出排序过程的每次迭代,我已经分别测试了排序函数和打印函数并且它们都有效,我尝试将打印函数放在循环中的不同位置但是也没有用。我是 c 和一般编程的新手,所以如果你也能向我解释这些步骤,我将不胜感激。 谢谢

请注意,您正在将数组从第 i 个元素开始传递给您的打印函数,但是您的打印函数希望通过初始化 i 来使数组具有 n 个元素在 for 循环中成为 0。结果,您实际上是在数组外打印元素。这也解释了为什么你总是打印 n 个元素,并且每次添加的数字数量都在增加。

我建议您在程序中使用 valgrind。它显示了您的程序中可能发生的各种内存错误。这是一个访问分配给你的内存之外的内存的例子,它会被捕获。它还会告诉您 运行.

末尾的内存泄漏(即您没有释放的内存)

此外,即使代码块只有 1 个命令长,也不要在代码中省略花括号。它会大大降低您的代码的可读性,并可能因此导致错误。

void PrintArray(int arr[], int n) { 
    int i; 
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]); 
    }
    printf("\n"); 
} 

这次通话

PrintArray(&arr[i], n);

总是使用存储在变量n中的值作为数组的输出元素数。因此,与起始索引 i 无关,该函数将尝试准确输出 n 个元素,从而导致访问数组之外​​的内存。

你必须写

PrintArray( &arr[i], n - i );

PrintArray( arr + i, n - i );

然而,您似乎希望在每次迭代中输出整个数组。如果是这样,那么你应该写

PrintArray( arr, n );

还要注意,指定数组元素个数的参数应该使用size_t类型而不是int类型,因为[=22]类型的对象=] 通常不能大到足以存储数组中可能的元素数。

那就是你的函数应该这样声明

void SelectionSort(int arr[], size_t n);

相应地函数PrintArray应该声明为

void PrintArray( const int arr[], size_t n );

注意第一个参数有限定符 const 因为数组的元素在函数内没有改变。

另外,只有当它们不是同一个元素时,您才应该交换数组的两个元素。

这是一个演示程序。

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

void PrintArray( const int [], size_t );
void Swap( int *, int * );

void SelectionSort( int arr[], size_t n )
{
    for ( size_t i = 1; i < n; i++ )
    {
        PrintArray( arr + i - 1, n - i - 1 );
        
        size_t min_idx = i - 1;

        for ( size_t j = i; j < n; j++ )
        {
            if ( arr[j] < arr[min_idx] ) min_idx = j;
        }           

        if ( min_idx != i - 1 ) Swap( &arr[min_idx], &arr[i-1] );
    }
}

void PrintArray( const int arr[], size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        printf( "%d ", arr[i] );
    }       
    putchar( '\n' );
}

void Swap( int *a, int *b )
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main(void) 
{
    enum { N = 10 };
    int a[N];
    
    srand( ( unsigned int )time( NULL ) );
    
    for ( size_t i = 0; i < N; i++ )
    {
        a[i] = rand() % N;
    }
    
    SelectionSort( a, N );
    
    PrintArray( a, N );
    
    return 0;
}

程序输出为

2 2 9 2 3 9 3 2 
2 9 2 3 9 3 2 
9 2 3 9 3 2 
9 3 9 3 2 
3 9 3 9 
9 3 9 
9 9 
9 

2 2 2 2 2 3 3 5 9 9