第十章(5).冒泡排序

来源:互联网 发布:盛世赢家软件下载 编辑:程序博客网 时间:2024/05/17 02:30

#include <iostream>
using namespace std ;

#define  MAXSIZE  20     //存储元素的顺序表的最大长度
typedef  int   KeyType ;   //关键字类型
typedef  int   InfoType ;   //其他数据项类型

typedef  struct {
 KeyType key ;
 InfoType otherinfor ;     //其他数据项
} RedType ;

typedef  struct {
 RedType r[ MAXSIZE + 1 ] ;    //r[0]闲置或用作哨兵单元
 int  length ;      //顺序表长度
} SqList ;         //顺序表类型

void InPut( SqList &L )
{
 int value = 0 ;
 int i = 1 ;
 while( i < ( MAXSIZE + 1 ) )
 {
  cin >> value ;
  if( value == -1 )     //以-1为结束符
   break ;
  L.r[ i ++ ].key = value ;
 }
 L.length = i - 1 ;
}

void BubbleSort( SqList &L )
{
 int j = 0 ;
 bool change ;

 for( int i = 1 ; i < L.length ; ++ i )   //最多n-1趟排序
 {
  change = false ;       //用于减少排序次数的(排序次数小于n-1)
  for( j = 1 ; j < L.length - i + 1 ; ++ j ) //第i趟冒泡排序是从L.r[1]到L.r[n-i+1]依次比较相邻两个记录的关键字,并在"逆序"时交换相邻的记录
  {           //其结果是这n-i+1个记录中关键字最大的记录被交换到第n-i+1的位置上
   if( L.r[ j ].key > L.r[ j + 1 ].key ) //Take care! It's "j < L.length - i + 1" , not "j < L.length - i + 2" ! Because it's "L.r[ j ].key > L.r[ j + 1 ].key ". Compare with "j + 1".
   {
    L.r[ 0 ] = L.r[ j ] ;
    L.r[ j ] = L.r[ j + 1 ] ;
    L.r[ j + 1 ] = L.r[ 0 ] ;
    change = true ;
   }
  }
  if( !change )
   return ;
 }         
}
void OutPut( SqList L )
{
 for( int i = 1 ; i < L.length + 1 ; ++ i )
 {
  cout << L.r[ i ].key << ' ' ;
 }
 cout << endl ;
}

int main( )
{
 SqList L ;

 InPut( L ) ;         //49 38 65 97 76 13 27 49 -1(结束符)
 BubbleSort( L ) ;
 OutPut( L ) ;

 return 0 ;
}


0 0
原创粉丝点击