双向排序 C语言 蓝桥杯

img


蓝桥杯 双向排序 C语言 为什么不对呀😢😢求指点
#include <stdio.h>
int a[100000];
int n, m, pi, qi;
void A(int *a, int *b) //交换
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
int main()
{
scanf_s("%d %d", &n, &m); //输入n,m
int i, j, k;
k = n;
for (i = 0; i < n; i++) //a[0]---a[n-1]从小到大赋值
a[i] = i + 1;
for (i = 1; i <= m; i++) //执行m次
{
scanf_s("%d %d", &pi, &qi); //输入pi,qi
if (pi == 0){ //pi=0的情况(要求:a[0]--a[qi-1]降序排列)
if (a[0] < a[qi - 1]){ //如果原来是升序,交换
for (j = 0; j < qi; j++, qi--) {
if(j!=(qi-1))
A(&a[j], &a[qi - 1]);
}
}
}
if (pi == 1){ //pi=1情况(要求:a[qi-1]--a[n-1]升序排列)
if (a[qi - 1] > a[k - 1]){ //如果原来是降序,交换
for (j = qi; j < k; j++, k--) {
if ((j - 1) != (k - 1))
A(&a[j - 1], &a[k - 1]);
}
}
}
}
for (i = 0; i < n; i++) //输出结果
printf("%d ", a[i]);
return 0;
}
求指正错误❌的地方

排序很乱,把排序单独封装一个函数,这样比较好处理逻辑,给你修改一下代码。
运行结果:

img

代码修改如下:

#include <stdio.h>
//flag=0表示降序,=1表示升序
void bubblesort(int a[],int n,int flag)
{
    int i,j,t;
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if(flag && a[j]>a[j+1])
            {
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }else if (flag ==0 && a[j]<a[j+1])
            {
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
}

int main()
{
    int m,n,i,j,pi,qi;
    int a[10000];
    scanf("%d %d",&n,&m);
    //给数组赋值
    for (i=0;i<n;i++)
        a[i] = i+1;
    for (i=0;i<m;i++)
    {
        scanf("%d %d",&pi,&qi);
        if(pi==1)//a[qi-1]~a[n-1]升序排列
            bubblesort(&a[qi-1],n-qi+1,1);
        else
            bubblesort(a,qi,0);
    }
    //输出结果
    for (i=0;i<n;i++)
    {
        if(i<n-1)
            printf("%d ",a[i]);
        else
            printf("%d",a[i]);
    }
    return 0;
}