选择排序排序不正确
selection sort isn't sorting correctly
我的选择排序算法工作不正常。我已经坚持了很长时间。我已经使用指针解决了它,但由于某种原因它排序不正确。
void sortArray(int arr[], size_t n)
{
int i;
int j;
int min_idx;
int min;
for (i = 0; i < n - 2; i++)
{
min = arr[i];
min_idx = i;
for (j = (i+1); j < n - 1; j++)
{
if (arr[j] < arr[min])
{
min = arr[j];
min_idx = j;
}
}
//swap(arr[min_idx], arr[i]);
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
之前
10 9 8 7 6 5 4 3 0 0
之后
0 9 7 3 6 4 5 8 10 0
但不胜感激。
您的内部 if
使用了错误的索引。应该是
if (arr[j] < arr[min_idx])
或者,因为 arr[min_idx]
已经存储在 min
if (arr[j] < min)
您的排序还差一个索引。你从不看arr[n - 1]
.
三个小错误。
你的循环条件错误和一个变量名错误(min
而不是 min_idx
)。
修复这三个错误让我们...
void sortArray(int arr[], size_t n)
{
int i;
int j;
int min_idx;
for (i = 0; i < n - 1; i++)
{
min_idx = i;
for (j = (i+1); j < n; j++)
{
if (arr[j] < arr[min_idx])
{
min_idx = j;
}
}
//swap(arr[min_idx], arr[i]);
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
还删除了未使用的 min
变量。
函数中至少有两个错误。
第一个是索引为n-1
的数组的最后一个元素由于循环中的条件而没有参与数组的排序
for (i = 0; i < n - 2; i++)
{
min = arr[i];
min_idx = i;
for (j = (i+1); j < n - 1; j++)
//..
第二个错误是在这个if语句中
if (arr[j] < arr[min])
在操作数 arr[min]
.
中使用 min
作为索引而不是 min_index
注意当n
等于0
或者1
那么在循环的条件下
for (i = 0; i < n - 2; i++)
表达式 n - 2
将产生一个大的无符号值,导致函数的未定义行为。
还有这些变量
int i;
int j;
int min_idx;
应具有类型 size_t
而不是类型 int
。
还在使用变量的最小范围内声明变量。
函数可以这样定义。
void sortArray( int arr[], size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
size_t min_idx = i;
for ( size_t j = i + 1; j < n; j++ )
{
if ( arr[j] < arr[min_idx] )
{
min_idx = j;
}
}
if ( i != min_idx )
{
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
}
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sortArray( int arr[], size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
size_t min_idx = i;
for ( size_t j = i + 1; j < n; j++ )
{
if ( arr[j] < arr[min_idx] )
{
min_idx = j;
}
}
if ( i != min_idx )
{
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
}
int main(void)
{
srand( ( unsigned int )time( NULL ) );
while ( 1 )
{
printf( "Enter the size of an integer array: " );
size_t n = 0;
if ( scanf( "%zu", &n ) != 1 || n == 0 ) break;
putchar( '\n' );
int a[n];
for ( size_t i = 0; i < n; i++ )
{
a[i] = rand() % n;
}
printf( "Source array: " );
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
sortArray( a, n );
printf( "Sorted array: " );
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
putchar( '\n' );
}
return 0;
}
它的输出可能看起来像
Enter the size of an integer array: 10
Source array: 4 1 1 3 1 8 7 4 0 9
Sorted array: 0 1 1 1 3 4 4 7 8 9
Enter the size of an integer array: 0
我的选择排序算法工作不正常。我已经坚持了很长时间。我已经使用指针解决了它,但由于某种原因它排序不正确。
void sortArray(int arr[], size_t n)
{
int i;
int j;
int min_idx;
int min;
for (i = 0; i < n - 2; i++)
{
min = arr[i];
min_idx = i;
for (j = (i+1); j < n - 1; j++)
{
if (arr[j] < arr[min])
{
min = arr[j];
min_idx = j;
}
}
//swap(arr[min_idx], arr[i]);
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
之前
10 9 8 7 6 5 4 3 0 0
之后
0 9 7 3 6 4 5 8 10 0
但不胜感激。
您的内部 if
使用了错误的索引。应该是
if (arr[j] < arr[min_idx])
或者,因为 arr[min_idx]
已经存储在 min
if (arr[j] < min)
您的排序还差一个索引。你从不看arr[n - 1]
.
三个小错误。
你的循环条件错误和一个变量名错误(min
而不是 min_idx
)。
修复这三个错误让我们...
void sortArray(int arr[], size_t n)
{
int i;
int j;
int min_idx;
for (i = 0; i < n - 1; i++)
{
min_idx = i;
for (j = (i+1); j < n; j++)
{
if (arr[j] < arr[min_idx])
{
min_idx = j;
}
}
//swap(arr[min_idx], arr[i]);
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
还删除了未使用的 min
变量。
函数中至少有两个错误。
第一个是索引为n-1
的数组的最后一个元素由于循环中的条件而没有参与数组的排序
for (i = 0; i < n - 2; i++)
{
min = arr[i];
min_idx = i;
for (j = (i+1); j < n - 1; j++)
//..
第二个错误是在这个if语句中
if (arr[j] < arr[min])
在操作数 arr[min]
.
min
作为索引而不是 min_index
注意当n
等于0
或者1
那么在循环的条件下
for (i = 0; i < n - 2; i++)
表达式 n - 2
将产生一个大的无符号值,导致函数的未定义行为。
还有这些变量
int i;
int j;
int min_idx;
应具有类型 size_t
而不是类型 int
。
还在使用变量的最小范围内声明变量。
函数可以这样定义。
void sortArray( int arr[], size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
size_t min_idx = i;
for ( size_t j = i + 1; j < n; j++ )
{
if ( arr[j] < arr[min_idx] )
{
min_idx = j;
}
}
if ( i != min_idx )
{
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
}
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sortArray( int arr[], size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
size_t min_idx = i;
for ( size_t j = i + 1; j < n; j++ )
{
if ( arr[j] < arr[min_idx] )
{
min_idx = j;
}
}
if ( i != min_idx )
{
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
}
int main(void)
{
srand( ( unsigned int )time( NULL ) );
while ( 1 )
{
printf( "Enter the size of an integer array: " );
size_t n = 0;
if ( scanf( "%zu", &n ) != 1 || n == 0 ) break;
putchar( '\n' );
int a[n];
for ( size_t i = 0; i < n; i++ )
{
a[i] = rand() % n;
}
printf( "Source array: " );
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
sortArray( a, n );
printf( "Sorted array: " );
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
putchar( '\n' );
}
return 0;
}
它的输出可能看起来像
Enter the size of an integer array: 10
Source array: 4 1 1 3 1 8 7 4 0 9
Sorted array: 0 1 1 1 3 4 4 7 8 9
Enter the size of an integer array: 0