输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
输入
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。
输出
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行
样例输入
3 3 -4 2
4 0 1 2 -3
0
样例输出
-4 3 2
-3 2 1 0
这个题比较坑,当输入为0时结束,如果你在代码中while(n&&saanf("%d",)这样的话,不论你最终结果是否正确,最终都会显示输出超限,要像我下面这样就可以了
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
void def(int *a,int *b,int l,int h)
{
if(l<h)
{
int x=a[l],i=l,j=h;
while(l<h)
{
while(l<h&&x<a[h])
{
h--;
}
if(l<h)
{
a[l]=a[h];
int t=b[l];
b[l]=b[h];
b[h]=t;
l++;
}
while(l<h&&x>a[l])
{
l++;
}
if(l<h)
{
a[h]=a[l];
int t=b[h];
b[h]=b[l];
b[l]=t;
}
}
a[l]=x;
def(a,b,i,l-1);
def(a,b,l+1,j);
}
}
int main()
{
int n,*a,*b;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
return 0;
a=new int[n];
b=new int[n];
for(int i=0;i<n;i++)
{
cin>>b[i];
a[i]=abs(b[i]);
}
def(a,b,0,n-1);
for(int i=n-1;i>=0;i--)
{
cout<<b[i]<<" ";
}
cout<<endl;
delete a;
delete b;
}
return 0;
}