笔试面试系列---排序算法专辑---冒泡排序---错误答案纠正

本文详细解析了冒泡排序算法的实现过程,并针对原始代码中的逻辑错误进行了修正,通过引入临时变量temp和调整循环逻辑,实现了对数组元素的有效排序。文中还对比了修正前后的输出结果,清晰展示了排序效果的提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原答案:

#include <stdio.h>
#define LEN 10                //数组长度
void main( void )
{
int ARRAY[10] = { 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 };  //待排序数组
printf( "\n" );
for( int a = 0; a < LEN; a++ )        //打印数组内容
{
printf( "%d ", ARRAY[a] );
}
int i = 0;
int j = 0;
bool isChange;               //设定交换标志
for( i = 1; i < LEN; i++ )
{                  //最多做 LEN-1 趟排序
isChange  = 0;            //本趟排序开始前,交换标志应为假
for( j = LEN-1; j >= i; j-- )        //对当前无序区 ARRAY[i..LEN]自下向上扫描
{
if( ARRAY[j+1] < ARRAY[j] )
{              //交换记录
ARRAY[0] = ARRAY[j+1];    //ARRAY[0]不是哨兵,仅做暂存单元
ARRAY[j+1] = ARRAY[j];
ARRAY[j] = ARRAY[0];
isChange  = 1;        //发生了交换,故将交换标志置为真
}
}
printf( "\n" );
for( a = 0; a < LEN; a++)        //打印本次排序后数组内容
{
printf( "%d ", ARRAY[a] );
}
if( !isChange )            //本趟排序未发生交换,提前终止算法
{
break;
}
} 
printf( "\n" );
return;
} 

思路分析:

从数列头开始比较逐个比较相邻的像个数的大小,在数列尾得出最大或最小的数。再重新按照上面的方式逐个比较剩下的n-1个数。最终完成排序。

错误分析:

for( i = 1; i < LEN-1; i++ )处错误导致没有对ARRAY[0]进行排序。for( a = 0; a < LEN; a++)  出未对局部变量a生命类型。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

修正答案:

#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
#define LEN 10   

int _tmain(int argc, _TCHAR* argv[])
{
	int ARRAY[10] = { 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 };  //待排序数组
	for( int a = 0; a < LEN; a++ )        //打印数组内容
	{
		printf( "%d ", ARRAY[a] );
	}
	int i = 0;
	int j = 0,temp=0;
	bool isChange;               //设定交换标志
	for( i = 0; i < LEN-1; i++ )
	{							 //最多做 LEN-1 趟排序
		isChange  = 0;            //本趟排序开始前,交换标志应为假
		for( j = LEN-1; j >= i; j-- )        //对当前无序区 ARRAY[i..LEN]自下向上扫描
		{
			if( ARRAY[j] < ARRAY[j-1] )
			{								 //交换记录
				temp = ARRAY[j];    //temp做暂存单元
				ARRAY[j] = ARRAY[j-1];
				ARRAY[j-1] = temp;
				isChange  = 1;        //发生了交换,故将交换标志置为真
			}
		}
		printf( "\n" );
		for(int a = 0; a < LEN; a++)        //打印本次排序后数组内容
		{
			printf( "%d ", ARRAY[a] );
		}
		if( !isChange )            //本趟排序未发生交换,提前终止算法
		{
			break;
		}
	} 
	printf( "\n" );
	return 0;
}

修正分析:

讲temp代替ARRAY[0]做中转;从ARRAY[0]开始排序。

修正后输出:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FeelTouch Labs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值