原答案:
#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;
}