C 按所需方式对数组排序

C 按所需方式对数组排序,c,arrays,sorting,bubble-sort,C,Arrays,Sorting,Bubble Sort,我需要对奇数位置的元素按降序排序,对偶数位置的元素按升序排序。这是我的代码,我无法中断第一个循环 #include<stdio.h> int main() { int n, t; printf("Enter the size of the array\n"); scanf("%d", &n); int i, a[n]; if ((n > 20) || (n <= 0)) printf("Invalid

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

#include<stdio.h>

int main()
{
    int n, t;

    printf("Enter the size of the array\n");
    scanf("%d", &n);
    int i, a[n];

    if ((n > 20) || (n <= 0))
        printf("Invalid Size");
    else
    {
        printf("Enter the values\n");
        for (i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
        }

        for (i = 0; i < n; i + 2)
        {
            if (a[i] > a[i + 2])
            {
                t = a[i];
                a[i] = a[i + 2];
                a[i + 2] = t;
            }
        }
        for (i = 1; i < n; i + 2)
        {
            if (a[i] < a[i + 2])
            {
                t = a[i];
                a[i] = a[i + 2];
                a[i + 2] = t;
            }
        }
        for (i = 0; i < n; i++)
        {
            printf("%d\n", a[i]);
        }
    }
}
#包括
int main()
{
int n,t;
printf(“输入数组的大小\n”);
scanf(“%d”和“&n”);
int i,a[n];
如果((n>20)|(na[i+2])
{
t=a[i];
a[i]=a[i+2];
a[i+2]=t;
}
}
对于(i=1;i
  • 最明显的问题是,你的
    for
    永远不会结束,因为
    i
    从来没有实际更新过。
    for(i=0;i
    中的
    i+2
    不会更新
    i
    ,这将永远保持其初始值。 尝试类似于(i=0;i的方法
  • 第二个问题是您没有真正执行排序。 我猜你是在尝试实现某种形式的。 它使用比较进行排序。不可能使用小于
    n logn
    的操作对数组进行排序(使用比较进行排序时)。您是在线性时间内对数组进行排序,这对您来说应该是一个危险信号
尝试为添加另一个
,如下所示:

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;
        }

希望有帮助。

对于初学者,根据C标准,不带参数的函数main应声明如下

int main( void )
将变量
n
声明为具有类型
int
,然后检查其值是否小于零,没有太大意义。最好将其声明为具有类型
size\u t

并且应该在检查之后声明数组

if ((n > 20) || (n <= 0))
    printf("Invalid Size");
else
{
    int a[n];
    //...
程序输出为

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 

<代码>;I+2 < /代码> ->代码>;I+= 2 < /Cord>!并注意越界错误。@ VLAs。标准是:C,不是C++。<代码>为(i=0;i<n;i +2)< /> > >代码>(i=0;i<n-2;i+= 2)
为避免访问数组外部,即使用
i
您不需要真正进行排序。您的代码只需同时交换两个元素。要对数组进行排序,您需要与所有其他元素进行比较。无论如何,请尝试以下操作-1)将数组拆分为两个数组,2)对每个数组使用qsort,3)重建完整数组。这样,您就不需要编写排序代码yourself@JustinJ.:好吧,如果你只使用古老的C90编译器,那么仅仅使用古老的功能就会遇到问题。自上个千年(C99)结束以来,VLA一直是标准C的一部分。事实上,微软还没有意识到新千年的到来是另一个问题。
for (i = 0; i < n; 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