//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;
}