#include<algorithm>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n),n)
{
int s[105];
for (int i=0; i<n; i++)
scanf("%d",&s[i]);
for (int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(abs(s[i])<abs(s[j]))
swap(s[i],s[j]);
printf("%d",s[0]);
for(int i=1;i<n;i++)
printf(" %d",s[i]);
puts("");
}
return 0;
}
这串代码有以下几点值得学习之处:
1.代码分块,不同功能的代码分在不同的区域(输入代码,实现代码,输出代码),用两空行分隔,一目了然。
2.对于格式要求严格的oj,输出结果时往往要求“两个数之间用一个空格隔开。每个测试实例占一行。” 但是使用以下代码显然是巧妙的解决了这个问题:
printf("%d",s[0]);
for(int i=1;i<n;i++)
printf(" %d",s[i]);
puts("");
3.学习到了swap()函数和abs()函数。
4.在这里还要谈谈冒泡:
for (int i=0;i<n-1;i++) //表示冒泡次数,只要冒总个数-1次就能完成排序了,不能理解就举3 2 1 的例子,这只要冒3-1=2次.
for(int j=i+1;j<n;j++) //拿第i个数和它的后一个数i+1比,i+2比,i+3比......
//为什么是比n-(i+1)次呢?检索次数计算是:总个数-数所在位置数,因为数组是从0开始的所以 数所在位置数为i+1
if(abs(s[i])<abs(s[j]))
swap(s[i],s[j]);