前一章讲过的简单桶排序有很多缺陷,它只能给整数排序,对付浮点数就无能为力了。如果想对像3.5, 5.66, 7.43, 6.9 这些小数排序,可以用冒泡排序法(bubble sort)。冒泡排序法的基本思想是:每次比较两个相邻的元素,如果顺序错误就交换它们的位置。
例如我们对66 77 99 100 101 45 这6个数按从大到小的顺序排序,也就是越小的数越靠后(好像这是一句废话),但这是很重要的一句话。现在开始排序,66比77小,所以交换位置,此时顺序是7766 99 100 101 45,继续比较66比99小,所以交换位置77 9966 100 101 45,一次类推知道比较到77 99 100 10166 45,这时66比45大,所以无需交换。第一轮排序结束,把数列中最小的数放到了队尾。第二轮排序又是从第一个元素开始按照同样的规律吧第二小的数向后移,只到进行到第n-1轮。为什么n个数只执行n-1轮呢?你想啊,执行完n-1轮的时候除了第n个数还没归位,其他都已经跟别人比过并找到适合自己的位置了。所以最后一轮就没有必要进行了。
下面贴出c++源码:
#include <iostream>
using namespace std;
int main()
{
int i,j,n,a[100],tmp;
cin >> n;
for(i=0;i<n;i++)
{
cin >> a[i];
}
for(i=1;i<=n-1;i++) //此处i不能为赋0;否则第0次循环时内循环a[j+1]会溢出
{
for(j=0;j<n-i;j++)
{
if(a[j]<a[j+1])
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
for(i=0;i<n;i++)
{
cout << a[i] << " ";
}
}