冒泡排序的代码如下:
template<class T>
void bubble(T a[],int n)
{
for (int i=0;i<n-1;i++)
if(a[i]<a[i+1])
swap(a[i],a[i+1])
}
template<class T>
void bubbleSort(T a[],int n)
{
for(int i=n;i>1;i--)
bubble(a,i);
}
第一个程序为一次冒泡排序过程,即从第一个元素开始,将其与右边相邻的元素进行对比,如果比右边相邻的元素大,则交换他们的位置,一轮比较下来,最大的元素就跑到最右边去了。
第二个程序为完整的冒泡排序过程,首先对所有的n个元素进行一次冒泡过程,将最大的元素移到最右边,然后对剩下的n-1个元素再进行一次冒泡过程,将剩下得n-1个元素里面最大的元素排到n-1这个位置,然后对剩下的n-2个元素再进行一次冒泡过程........,直到排序完成。
其实冒泡排序过程与选择排序过程是类似的,只是选择排序是直接找到最大的,放到最后,冒泡排序则是靠冒泡过程找到最大的并放到最后。
与之前的选择排序一样这个冒泡排序也存在不能及时终止的问题,下面是完善代码:
template<class T>
bool bubble(T a[],int n)
{
bool swapped=false;
for(int i=0;i<n-1;i++)
{
if(a[i]<a[i+1])
{
swap(a[i],a[i+1]);
swapped=true;
}
}
return swapped;
}
template<class T>
void bubbleSort(T a[],int n)
{
for(int i=n;i>1&&bubble(a,i);i--);
}
上面这个程序理解起来比选择排序的终止算法要简单,只要在一次冒泡过程中没有发生交换,那么就可以说明数组已经排序好了,外层循环可以退出了。