我正在尝试打印排序函数的迭代,它似乎有效但有一些额外的数字
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
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