以所需方式对数组进行排序

时间:2017-06-27 15:22:29

标签: c arrays sorting bubble-sort

我需要按降序排序奇数位置的元素,按升序排序偶数位置的元素。这是我的代码,我无法打破第一个循环。

remote

2 个答案:

答案 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)的内容。
  • 第二个问题是你并没有真正进行排序。 我想你正试图实现某种bubble sort。 它使用比较进行排序。使用少于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];
}

希望它有所帮助。