用数组实现冒泡排序---图释

 

(1)从小到大排序

 

算法分析: 排序是将一组随机排放的数按从小到大 ( ) 或从大到小 ( 降序 ) 重新排列。排序有冒泡法、选择 法和插入法等。
 
起泡法的思路是: 将相邻两个数a[i]和a[i+1]比较,将大数调到后头,小数调到前头;
 
用一例子的图释方法来理解冒泡法
 
                                                      
此例。排序元素个数为n=6
 
 
第一趟排序(注意此处用j=0表示第一趟)
j=0 
此趟排序比较和交换过程如上图所示,此趟比较5次,即6-1=(n-1)-j次
比较代码如下
for(i=0;i<5;i++)                   
    if (a[i]>a[i+1])     
    { t=a[i];a[i]=a[i+1];a[i+1]=t; }

for(i=0;i<n-1;i++)                   
    if (a[i]>a[i+1])     
    { t=a[i];a[i]=a[i+1];a[i+1]=t; }

 
 
 
第二趟排序
j=1
此趟排序比较和交换过程如上图所示,此趟比较4次,即6-2=n-2=(n-1)-j次
比较代码如下
for(i=0;i<4;i++)                   
    if (a[i]>a[i+1])     
    { t=a[i];a[i]=a[i+1];a[i+1]=t; }

for(i=0;i<n-2;i++)                   
    if (a[i]>a[i+1])     
    { t=a[i];a[i]=a[i+1];a[i+1]=t; }

 

第三趟排序
j=2
此趟排序比较和交换过程如上图所示,此趟比较3次,即6-3=n-3=(n-1)-j次
比较代码如下
for(i=0;i<3;i++)                   
    if (a[i]>a[i+1])     
    { t=a[i];a[i]=a[i+1];a[i+1]=t; }

for(i=0;i<n-3;i++)                   
    if (a[i]>a[i+1])     
    { t=a[i];a[i]=a[i+1];a[i+1]=t; }

 

第四趟排序
j=3
此趟排序比较和交换过程如上图所示,此趟比较2次,即6-4=n-4=(n-1)-j次
比较代码如下
for(i=0;i<2;i++)                   
    if (a[i]>a[i+1])     
    { t=a[i];a[i]=a[i+1];a[i+1]=t; }

for(i=0;i<n-4;i++)                   
    if (a[i]>a[i+1])     
    { t=a[i];a[i]=a[i+1];a[i+1]=t; }

第五趟排序
j=4
此趟排序比较和交换过程如上图所示,此趟比较1次,即6-5=n-5=(n-1)-j次
比较代码如下
for(i=0;i<1;i++)                   
    if (a[i]>a[i+1])     
    { t=a[i];a[i]=a[i+1];a[i+1]=t; }

for(i=0;i<n-5;i++)                   
    if (a[i]>a[i+1])     
    { t=a[i];a[i]=a[i+1];a[i+1]=t; }

 

冒泡法总结

u 如果有 n 个数,则要进行 n-1 趟比较(和交换)。
u 在第 1 趟中要进行 n-1 次两两比较,在第 j 趟中要进行 n-j 次两两比较。
u 根据以上思路写出程序,今设 n=10 ,从前面的叙述可知,应该进行 9 趟比较和交换。
 
#include <iostream>
using namespace std;
int main( )
{
  int  a[10];
  int i,j,t;
  cout<<"input 10 numbers :"<<endl;
  for (i=0;i<10;i++) cin>>a[i];      //输入a[0]~a[9]
  cout<<endl;
  for (j=0;j<9;j++)                      //共进行9趟比较
     for(i=0;i<9-j;i++)               //在每趟中要进行(10-j)次两两比较
        if (a[i]>a[i+1])                   //如果前面的数大于后面的数
         {t=a[i];a[i]=a[i+1];a[i+1]=t;} //交换两个数的位置,使小数上浮                                                         
  cout<<"the sorted numbers :"<<endl;
  for(i=0;i<10;i++)   cout<<a[i]<<" ";          //输出10个数
  cout<<endl;
  return 0;
}

为了更好理解
我们用一个比存放实际个数多1的数组
using namespace std;
int main( )
{
  int a[11];//数组大小为11,只用下标为1~10的元素,a[0]不用
  int i,j,t;
  cout<<"input 10 numbers :"<<endl;
  for (i=1;i<11;i++)                       //输入a[1]~a[10]
    cin>>a[i];
  cout<<endl;
  for (j=1;j<=9;j++)                      //共进行9趟比较
    for(i=1;i<=10-j;i++)                  //在每趟中要进行(10-j)次两两比较
       if (a[i]>a[i+1])                   //如果前面的数大于后面的数
	   { t=a[i];
	     a[i]=a[i+1];
	     a[i+1]=t;}   //交换两个数的位置,使小数上浮,大数下沉
  cout<<"the sorted numbers :"<<endl;
  for(i=1;i<11;i++)                      //输出10个数
    cout<<a[i]<<"  ";
  cout<<endl;
  return 0;
}

 
(2)由大到小排序
// 编写程序,用起泡法对10个数排序(按由大到小顺序)。
#include <iostream>
using namespace std;
int main( )
{
  int a[11];//数组大小为11,只用下标为1~10的元素,a[0]不用
  int i,j,t;
  cout<<"input 10 numbers :"<<endl;
  for (i=1;i<11;i++)                       //输入a[1]~a[10]
    cin>>a[i];
  cout<<endl;
  for (j=1;j<=9;j++)                      //共进行9趟比较
    for(i=1;i<=10-j;i++)                  //在每趟中要进行(10-j)次两两比较
       if (a[i]<a[i+1])                   //如果前面的数大于后面的数
	   { t=a[i];
	     a[i]=a[i+1];
	     a[i+1]=t;}   //交换两个数的位置,使大数上浮,小数下沉
  cout<<"the sorted numbers :"<<endl;
  for(i=1;i<11;i++)                      //输出10个数
    cout<<a[i]<<"  ";
  cout<<endl;
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值