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