c-这个选择排序的逻辑有什么错误



第一个for循环将从末尾开始,并将其值交换为数组a[0->其自身索引]中的最大值

int selection_sort(int *a, int size) {
int i, j, swap;


for (i = size - 1; i <= 0; i--) {
/*this will find the max between o index to i th index*/
for (j = 0; j <= i; j++) {
if (a[i] < a[j]) {
swap = a[i];
a[i] = a[j];
a[j] = a[i];
}
}
}
}

输出是相同的阵列,顺序不变

对于初学者来说,函数具有返回类型int,但不返回任何内容。此外,第二个参数应该具有无符号整数类型size_t,而不是有符号整数类型int

此外,您应该在使用变量的最小作用域中声明变量。

你的代码的主要问题是这个for循环的主体

for (i = size - 1; i <= 0; i--) {

如果CCD_ 4不小于CCD_。

还有一个打字错误

a[j] = a[i];

你必须写

a[j] = swap;

除此之外,还有多余的互换。

的功能如下

void selection_sort( int *a, size_t n ) 
{
for ( size_t i = n; i-- != 0; ) 
{
size_t max = i;
for ( size_t j = 0; j < i; j++ ) 
{
if ( a[max] < a[j] ) max = j;
}
if ( max != i )
{
int swap = a[max];
a[max] = a[i];
a[i] = swap;
} 
}
}

这是一个示范节目。

#include <stdio.h>
void selection_sort( int *a, size_t n ) 
{
for ( size_t i = n; i-- != 0; ) 
{
size_t max = i;
for ( size_t j = 0; j < i; j++ ) 
{
if ( a[max] < a[j] ) max = j;
}
if ( max != i )
{
int swap = a[max];
a[max] = a[i];
a[i] = swap;
} 
}
}
int main( void )
{
int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
const size_t N = sizeof( a ) /sizeof( *a );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( 'n' );
selection_sort( a, N );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( 'n' );
}

其输出为

9 8 7 6 5 4 3 2 1 0 
0 1 2 3 4 5 6 7 8 9 

您的for循环是错误的for (i = size - 1; i <= 0; i--)。比较应为>=0

此外,价值交换是不正确的

if (a[i] < a[j]) {
swap = a[i];
a[i] = a[j];
a[j] = a[i];
}

应该是

if (a[i] < a[j]) {
swap = a[i];
a[i] = a[j];
a[j] = swap;
}

最新更新