冒泡排序


//file 冒泡排序1.cpp

//例:将有10个元素的数组用冒泡排序法按升序排列


// 冒泡排序(设按升序)算法:
//
//   第一趟两两比较:从第一个元素(0下标)开始进行相邻两个元素的比较,
// 若前者比后者大,则两者交换位置,再按同样的方法比较下两个相邻元素,一直
// 比较到最后两个元素(a[n-2]和a[n-1])。这样,经第一趟两两比较后,排在最后
// 的元素(下标为n-1)为最大元素(已经排好序)。
//
//   第二趟两两比较:从第一个元素开始再进行相邻两个元素的比较,规则同上,一
// 直比较到未排序元素的最后两个元素(a[n-3]和a[n-2])。这样,经第二趟两两
// 比较后,排在最后的两个元素已经排好序。
//
//  依次类推,共最多进行n-1趟(最坏情况下)以后,就可以将n个元素都排好序。


#include"iostream.h"

void bubble(int [],int);//or void bubble(int *,int);

void main(void)
{
 int array[]={1,5,4,3,6,2,7,8,10,9};//最坏情况下,需要进行9轮

 int lenofarray=sizeof(array)/sizeof(int);//元素个数

 cout<<"排序前的各元素:/n";
 for(int i=0;i<lenofarray;i++) //按原始顺序输出个元素值
  cout<<array[i]<<",";

 cout<<endl<<endl;
 bubble(array,lenofarray);//调用冒泡排序函数

 cout<<"/n/nafter bubble:/n";
 for(i=0;i<lenofarray;i++) //排序后数组array的各元素值有改变!
  cout<<array[i]<<",";//   冒泡排序2.cpp   也有改变!
 
 cout<<endl;
}

void bubble(int a[],int size)
{
int i,temp,flag;//增加一个标志flag,以便一旦已经排好序,则提前结束,
                  //而不一定都要经过size-1轮

cout<<"正在冒泡排序:/n";

for(int pass=1;pass<size;pass++){  //最坏时最多比较size-1轮
 
 flag=0;

 for(i=0;i<size-pass;i++)  //第pass轮时,需要比较次数为:size-pass
  if(a[i]>a[i+1])  //交换a[i]和a[i+1]
   {
   flag+=1;
   temp=a[i];a[i]=a[i+1];a[i+1]=temp;
   }

 //if(flag==0) break;//若本轮结束时,已没有交换元素,则说明已排好序。

//以下输出经此轮排序后的结果
 
for(i=0;i<size;i++){
 if(a[i]==a[size-pass])  cout<<"|"<<a[i]<<",";
 
 else cout<<a[i]<<",";
 }

if(flag==0) break;//若本轮结束时,已没有交换元素,则说明已排好序。

cout<<endl<<endl;

 }

 

 

 

 

//file 冒泡排序2.cpp 

//例:将有10个元素的数组用冒泡排序法按升序排列


// 冒泡排序(设按升序)算法:
//
//   第一趟两两比较:从第一个元素(0下标)开始进行相邻两个元素的比较,
// 若前者比后者大,则两者交换位置,再按同样的方法比较下两个相邻元素,一直
// 比较到最后两个元素(a[n-2]和a[n-1])。这样,经第一趟两两比较后,排在最后
// 的元素(下标为n-1)为最大元素(已经排好序)。
//
//   第二趟两两比较:从第一个元素开始再进行相邻两个元素的比较,规则同上,一
// 直比较到未排序元素的最后两个元素(a[n-3]和a[n-2])。这样,经第二趟两两
// 比较后,排在最后的两个元素已经排好序。
//
//  依次类推,共最多进行n-1趟(最坏情况下)以后,就可以将n个元素都排好序。


#include"iostream.h"

//void bubble(int [],int);//or void bubble(int *,int);

void main(void)
{
 int array[]={1,5,4,3,6,2,7,8,10,9};//最坏情况下,需要进行9轮

 int lenofarray=sizeof(array)/sizeof(int);//元素个数

 cout<<"排序前的各元素:/n";
 for(int i=0;i<lenofarray;i++) //按原始顺序输出个元素值
  cout<<array[i]<<",";

 cout<<endl<<endl;

    cout<<"正在冒泡排序:/n";

 int temp,flag;//增加一个标志flag,以便一旦已经排好序,则提前结束,
                  //而不一定都要经过size-1轮

 

   for(int pass=1;pass<lenofarray;pass++){  //最坏时最多比较size-1轮
 
    flag=0;

    for(i=0;i<lenofarray-pass;i++)  //第pass轮时,需要比较次数为:size-pass
     if(array[i]>array[i+1])  //交换a[i]和a[i+1]
   {
   flag+=1;
   temp=array[i];array[i]=array[i+1];array[i+1]=temp;
   }//end of inner for

    if(flag==0) break;//若本轮结束时,已没有交换元素,则说明已排好序。

   //以下输出经此轮排序后的结果,并在已经排序的元素前加标志‘|’
 
      for(i=0;i<lenofarray;i++){//输出经过本趟排序后的全部元素
      if(array[i]==array[lenofarray-pass])  cout<<"|"<<array[i]<<",";
 
      else cout<<array[i]<<",";
  }

        cout<<endl<<endl;

 }//end of outer for


  cout<<"/n/nafter bubble:/n";

  for(i=0;i<lenofarray;i++) //排序后数组array的各元素值有改变!
  cout<<array[i]<<",";//   冒泡排序2.cpp   也有改变!
 
  cout<<endl;
}

 

 

 

发布了36 篇原创文章 · 获赞 0 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章