我需要按降序排序奇数位置的元素,按升序排序偶数位置的元素。这是我的代码,我无法打破第一个循环。
remote
答案 0 :(得分:2)
对于根据C标准的初学者,没有参数的函数main应声明为
int main( void )
将变量n
声明为具有类型int
之后,检查其值是否小于零是没有意义的。将它声明为类型size_t
。
应该在检查后声明数组
if ((n > 20) || (n <= 0))
printf("Invalid Size");
else
{
int a[n];
//...
像这样的循环
for (i = 0; i < n; i + 2)
变量i
未增加。很明显,您的意思是i += 2
。
循环只将第一个最小偶数和第一个最大奇数元素移动到数组的末尾。您需要额外的循环,它们将对阵列的其他元素执行相同的操作。那就是冒泡排序算法的实现是不正确的。
这是一个演示程序,显示如何根据数组的偶数和奇数元素的要求对数组进行排序。
#include <stdio.h>
#define N 20
int main(void)
{
int a[N] = { 18, 1, 16, 3, 14, 5, 12, 7, 10, 9, 8, 11, 6, 13, 4, 15, 2, 17, 0, 19 };
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
for ( size_t n = N, last; !( n < 3 ); n = last )
{
for ( size_t i = last = 2; i < n; i++ )
{
if ( ( i % 2 == 0 && a[i] < a[i - 2] ) ||
( i % 2 == 1 && a[i - 2] < a[i] ) )
{
int tmp = a[i];
a[i] = a[i - 2];
a[i - 2] = tmp;
last = i;
}
}
}
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
return 0;
}
程序输出
18 1 16 3 14 5 12 7 10 9 8 11 6 13 4 15 2 17 0 19
0 19 2 17 4 15 6 13 8 11 10 9 12 7 14 5 16 3 18 1
答案 1 :(得分:1)
for
永远不会结束,因为i
永远不会真正更新。 i+2
中的for (i = 0; i < n; i + 2)
不会更新永久保留其initia值的i
。
尝试使用类似for (i = 0; i < n; i=i+2)
的内容。 n logn
操作对数组进行排序是不可能的(使用比较进行排序时)。您是在线性时间对数组进行排序,这应该看起来像一个红旗。 尝试添加另一个for
,如下所示:
for (i = 0; i < n; i+= 2)
for (j = i+2; j < n; j+= 2)
if (a[i] > a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
最重要的是阅读有关您需要它的原因。
如果你觉得勇敢,你可以在不使用中间变量t
的情况下交换intgers(如下所示:XOR swap):
if (a[i] > a[j])
{
a[i] = a[i]^a[j];
a[j] = a[j]^a[i];
a[i] = a[i]^a[j];
}
希望它有所帮助。