给定一个序列,进行接下来的排序

给定一个序列: ①将非负数按从小到大排序,并重新放置回原来这些非负数所在的位置。 ②将负数按照从大到小的顺序排序,并放置回原来这些负数所在的位置。第一行一个整数N代表序列长度(1<n<1000) 第二行N个整数代表序列,输出一行,按游戏规则输出序列

用选择排序是较好的解决方法,先对非负数进行排序(跳过负数),然后再对负数进行排序,排序过程中跳过非负数。
代码及运行结果如下:

img

代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,j,n,t,minindex;
    int* a;
    int ff=0,fs=0; //非负数和负数的个数
    scanf("%d",&n);
    a = (int*)malloc(sizeof(int)*n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    //针对非负数排序
    for (i=0;i<n;i++)
    {
        if(a[i]< 0)
            continue;
        minindex = i;
        for(j=i+1;j<n;j++)
        {
            if(a[j] >=0 && a[j] < a[minindex])
            {
                minindex = j;
            }
        }
        //将第i小的数放在第i个位置
        if (i != minindex )
        {
            t = a[i];
            a[i] = a[minindex];
            a[minindex] = t;
        }
    }
    

    //针对负数从大到小排序
    for (i=0;i<n;i++)
    {
        if(a[i]>= 0) //跳过非负数
            continue;
        minindex = i;
        for(j=i+1;j<n;j++)
        {
            if(a[j] < 0 && a[j] > a[minindex])
            {
                minindex = j;
            }
        }
        //将第i大的数放在第i个位置
        if (i != minindex)
        {
            t = a[i];
            a[i] = a[minindex];
            a[minindex] = t;
        }
    }

    //输出
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
    free(a);
    a = 0;
    return 0;
}



考虑定义两个数组,分别表示非负数和负数在数组中的下标
然后各自双循环进行冒泡排序,用下标获取在数组中的值进行比较交换,同时交换下标的值以及数组的对应值,最后输出数组数据即可

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^