题目:
Problem 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 <math.h>
int main(void)
{
int n;
while ( scanf("%d", &n) && n!=0 )
{
int a[100];
int temp;
for ( int k=0; k<n; k++ )
{
scanf("%d", &temp);
a[k] = temp;
}
int t;
for ( int v=0; v<n-1; v++ )
{
if ( abs(a[v])<abs(a[v+1]) )
{
t = a[v];
a[v] = a[v+1];
a[v+1] = t;
}
}
for ( int c=0; c<n; c++ )
{
printf("%d ", a[c]);
}
printf("\n");
}
}
原因分析:
不清楚冒泡排序的写法 漏了一重for循环
解决方案:
两种排序方法 快速排序和冒泡排序都写了一遍 根据需要注释掉不需要用的代码
两种排序均AC
#include<stdio.h>
#include<math.h>
void bubblesort( int n );
void quicksort( int left, int right );
int a[100];
int i, j;
int main(void){
int n;
while ( ~scanf("%d", &n) && n!=0 )
{
for ( i=0; i<n; i++ )
scanf ( "%d", &a[i] );
quicksort ( 0, n-1 );
//bubblesort ( n );
for ( i=n-1; i>=0; i-- )
{
if ( i==n-1 )
{
printf ( "%d", a[i] );
continue;
}
printf ( " %d", a[i] );
}
printf ( "\n" );
}
return 0;
}
void bubblesort( int n )
{
int t;
for ( i=0; i<n; i++ )
for ( j=0; j<n; j++ )
{
if ( abs(a[i]) < abs(a[j]) )
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
void quicksort( int left, int right )
{
int pivot, t, temp;
if ( left>right ) return;
i = left;
j = right;
temp = a[left];
while ( i!=j )
{
while ( abs(a[j]) >= abs(temp) && j>i ) j--;
while ( abs(a[i]) <= abs(temp) && j>i ) i++;
if ( j>i )
{
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
a[left] = a[i];
a[i] = temp;
quicksort ( left, i-1 );
quicksort ( i+1, right );
}