冒泡排序是较常用的排序方法。是一类具有”交换“性质的排序方法。
冒泡排序的基本思想:
(以按从小到大排序为例)
(1)将序列中的第1个元素与第2个元素进行比较,若前者大于后者,交换,否则,不交换。
(2)再将第2个元素与第3个元素比较,若前者大于后者,则交换,否则,不交换。
(3)以此类推,直到第n-1个元素与第n个元素进行比较为止。
以上过程为第1趟冒泡排序。经过第一趟冒泡排序后,序列中最大的元素置于了序列的尾部。
(4)然后对剩下的n-1个元素做同样的操作,这叫做第二趟冒泡排序,
(5)如此下去,当执行完第n-1趟的冒泡排序后,冒泡排序就完成了。
实则不难想象,这种排序方法就是通过序列中相邻之间的交换,使较小的元素逐步从序列后端移到序列前端,使较大的元素从序列前端向后移。
冒泡算法与对其的改进
冒泡排序算法描述:
void bubblesort(keytype k[],int n)
{
int i,j,tmp;
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
{
if(k[i]>k[i+1])
{
tmp=k[i];
k[i]=k[i+1];
k[i+1]=tmp;
}
}
}
}
上述算法是对数据从小到大排序,k[0]不存放内容
但是,上述的算法并不是一个优秀的冒泡排序算法。如果在完成所有趟之前就已排好序,那么有些趟就只是比较而没有交换,即做的就是无用功。
在算法中可以设置一个标志变量flag。规定flag=1时说明本趟中仍有元素交换的动作,flag=0,无交换。
改进后的冒泡算法如下:
void bubblesort(keytype k[], int n)
{
int i,j,tmp;
for(i=1;i<=n-1&&flag==1;i++)
{
flag=0;
for(j=1;j<=n-i;j++)
{
if(k[i]>k[i+1])
{
tmp=k[i];
k[i]=k[i+1];
k[i+1]=tmp;
flag=1;
}
}
}
}
改进后的算法可以减少排序趟数,提高效率。
例:编写一个c程序,应用冒泡排序法对序列{2,5,6,3,7,8,0,9,12,1}进行排序,要求从大到小排序,并输出排序后结果。
#include"stdio.h"
void bubblesort(int k[],int n)
{
int i,j,tmp;
for(i=1;i<=n-1&&flag==1;i++)
{
flag=0;
for(j=1;j<n-i;j++)
{
if(k[i]<k[i+1])
{
tmp=k[i];
k[i]=k[i+1];
k[i+1]=tmp;
flag=1;
}
}
}
}
main()
{
int i,a[11]={-111,2,5,6,3,7,8,0,9,12,1};
printf("The orginal data array is\n");
for(i=1;i<=10;i++)
printf("%d",a[i]);
bubblesort(a,10);
printf("\nThe result of bubble sorting for the array is\n");
for(i=1;i<=10;i++)
printf("%d",a[i]);
getche();
}