一.算法介绍
起泡排序算法是很简单和容易使用的排序算法。在我研究算法的过程中,我发现他和直接插入算法很相似。下面来介绍下这个算法。
起泡是日常生活中经常看到的现象。重量轻的泡泡上浮,而重量比较重的石头等则下沉。
在排序的过程中,将设我们对一个数组进行排序。开始排序时,我们将第一个记录和第二个记录进行比较,如果第一个记录大于第二个记录,那么我们就将第二个记录上浮,第一个记录下沉,也就是说我们要使用“交换”的思想来将这两个元素进行交换,使大的元素下浮在数组的高下标出,小的元素上浮到数组下标低的位置。然后在用第二个元素和第三个元素进行比较,使用上述同样的方法来进行交换,直到将第n-1个元素和第n个元素进行了比较。这样我们就进行了一次起泡,将最大的元素下沉了。有人可能会觉的那前面的元素并不是排序的啊?对,前面的元素并没有按顺序来排序。所以我们还需要对第一个到n-1个元素进行一次起泡。
所以,实际上起泡排序算法就是在第一次起泡的时候,将最大的元素排在最后,然后在第二次起泡的时候,将次大的元素排在最大元素下标(n)的上一个元素下标处(n-1)。
很显然对一个数组进行排序结束的标记是,在一次排序中,我们没有使用哪怕一次的交换步骤,这样我们就可以认为排序已经完成,即使程序没有依次将最大的元素到最小的元素全部起泡一遍,我们也可以安然的退出排序了。这个就是和直接插入排序相比较快的地方。
二.源码
#include<iostream>
using namespace std ;
#define MAX_SIZE 20
//数组的第一个元素为数组中所需要进行排序的元素的个数,也就是数组实际的长度
void bubblesort(int array[MAX_SIZE])
{
bool isok = false ;//用来标示是否在一次起泡过程中没有使用交换步骤,若是就设置为true
int count = 0 ;//进行没有使用交换步骤的次数,从而判断在一次起泡过程中有没有使用交换步骤,从而设置isok的值
for (int i = array[0];i>=1;i--)
{
for (int j = 1 ; j < i ; j++)
{
if (array[j]>array[j+1])
{
int temp = array[j+1];//交换步骤
array[j+1]=array[j];
array[j]=temp;
}
else
{
count++;//没有交换的次数自增
if (count==i-1)//当没有交换的次数和这次起泡过程中需要进行关键字比较的次数相同的时候,就设置isok的值为true
{
isok = true ;
}
}
}
count = 0 ;//记住清0,以便下一次的计数
if (isok)//用来标示排序结束,如果满足则退出排序
{
cout<<"sort is sucessful!"<<endl;
break;
}
}
}
//测试数据
int main()
{
int array[10];
array[0]=9;
array[1]=3;
array[2]=12;
array[3]=1;
array[4]=14;
array[5]=2;
array[6]=89;
array[7]=32;
array[8]=31;
array[9]=31;
bubblesort(array);
for (int i = 1 ; i <= array[0];i++)
{
cout<<array[i]<<endl;
}
cin>>array[1];//为了暂停控制台窗口,别无他用,可以使用System("pause");来代替
return 0 ;
}
三.总结
这是比较简单的排序算法,很实用。拿来练习数据结构最合适不过。