标签:
在前面曾经简单的讲了一下排序,也讲到过这道题,是在冒泡的时候,今天会用快排的方式给一下代码:
Description
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
Input
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。
Output
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。
Sample Input
3 3 -4 2 4 0 1 2 -3 0
Sample Output
-4 3 2 -3 2 1 0
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void *x, const void *y)
{
if(*(int *)x<*(int *)y)
{
return 1;
}
else
{
return -1;
}
}
int main()
{
int n, i, j, a[105], b[105], flag[105];
while(~scanf("%d", &n))
{
if(n==0)
{
break;
}
for(i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
memset(b, 0, sizeof(b));
memset(flag, 0, sizeof(flag));
for(i=0; i<n; i++)
{
if(a[i]<0)
{
b[i]=-a[i];
}
else
{
b[i]=a[i];
}
}
qsort(b, n, sizeof(b[0]), cmp);
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(a[i]==-b[j])
{
flag[j]=4;//注意
}
}
}
for(i=0; i<n; i++)
{
if(flag[i]==4)
{
printf("%d", -b[i]);
}
else
{
printf("%d", b[i]);
}
if(i!=n-1)
{
printf(" ");
}
}
printf("\n");
}
return 0;
}
分析一下代码:
1.flag[]是用来标记的,还没想到更好的办法,所以。。
2.最好是把b[], flag[]都初始化为0(也可以为其他);
3.数组开的大一点;
4.再是输出的时候,注意一下题目要求,是结果后面都要有一个空行;
也可以看一下我原来的用冒泡的代码和关于快排的东西:
http://blog.csdn.net/unusualnow/article/details/43817885
http://blog.csdn.net/unusualnow/article/details/43818025
标签:
原文地址:http://blog.csdn.net/unusualnow/article/details/43866753