经典排序算法-冒泡排序
冒泡排序原理:输入序列中,相邻的数两两比较,将最大的数冒向水面(此处的水面定义为序列的最右端,进行增序排列);故在第i次冒泡时,序列的后i-1个数将不再被考虑;因而循环的层次为:外循环i=0到n-1(n为待排序列的长度),内循环是j=1到n-i。 所以理论上来说,冒泡排序执行1+2+.......(n-1)=n*(n-1)/2次,时间复杂度为0(n^2),当输入序列已排序完毕时,时间复杂度最好,为O(n)。实际编程时,我们可以引入flag标志位来优化程序,减少不必要的内层循环次数。
代码范例:
template <typename T>
void bubblesort(T* arr, int length)
{
int flag;
T tmp;
for (int i=0; i<length; i++)
{
flag=0; //标志位
for(int j=1; j<length-i; j++)
{
if(arr[j]<arr[j-1]) //相邻数,两两比较,若有需要,进行数据交换。
{
flag=1;
tmp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=tmp;
}
}
if(flag==0)
break;
}
}