给定一个序列: ①将非负数按从小到大排序,并重新放置回原来这些非负数所在的位置。 ②将负数按照从大到小的顺序排序,并放置回原来这些负数所在的位置。第一行一个整数N代表序列长度(1<n<1000) 第二行N个整数代表序列,输出一行,按游戏规则输出序列
用选择排序是较好的解决方法,先对非负数进行排序(跳过负数),然后再对负数进行排序,排序过程中跳过非负数。
代码及运行结果如下:
代码:
#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;
}
考虑定义两个数组,分别表示非负数和负数在数组中的下标
然后各自双循环进行冒泡排序,用下标获取在数组中的值进行比较交换,同时交换下标的值以及数组的对应值,最后输出数组数据即可