【杭电错题】#3绝对值排序——快速排序、冒泡排序

这篇博客介绍了杭电编程题中关于绝对值排序的问题,提供了输入输出样例,并分析了错误代码的原因——冒泡排序的实现不完整。博主给出了使用快速排序和冒泡排序的解决方案,两种方法均通过了测试。
摘要由CSDN通过智能技术生成

题目:

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 );
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值