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=0;ii
的方法 - 第二个问题是您没有真正执行排序。
我猜你是在尝试实现某种形式的。
它使用比较进行排序。不可能使用小于
的操作对数组进行排序(使用比较进行排序时)。您是在线性时间内对数组进行排序,这对您来说应该是一个危险信号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