l 算法介绍
冒泡排序也叫起泡排序,它是通过一系列的”交换”动作完成的。首先第一个记录和第二个记录比较,如果第一个比较大,则二者进行交换,否则不交换;然后第二个和第三个进行 比较,如果第二个比较 大,则二者交换,否则不交换···一直按照这种方式排序下去,最终最大的那个数据将被排到最后的位置。
l 算法流程
原始序列:23 12 8 34 21
1).下面开始进行第1趟排序:23 和12 比较,交换
结果:12 23 8 34 21
2).23 和8 比较,交换
结果:12 8 23 34 21
3).23 和34 比较,不交换
结果:12 8 23 34 21
4).34 和21 比较,交换
结果:12 8 23 21 34
第一趟冒泡结束后,最大的数据34被交换到了最后,接下来开始剩下的 12 8 23 21 进行冒泡排序,按照同样的方法进行第二趟排序。
要注意的是,冒泡排序算法结束的条件是一趟排序过程中没有发生元素交换。
l 代码示例
int bubblesort(int a[],int n)
{
int i=0,j=0;
for( i=0;i<n -1;i++)//n个数据需要进行n-1趟排序
{
int flag =0;
for(j=0;j<n-1-i;j++)//每趟排序结束后,进行比较的元素就会自动减少
{
if(a[j]>a[j+1])
{
int temp = a[j];
a[j] =a[j+1];
a[j+1] = temp;
flag =1;//如果元素发生了交换,则置标志位为1
}
}
if(flag == 0)
{
return 0;
}
}
return 0;
}
l 性能分析
1. 时间复杂度分析
1)最坏情况下,待排序是逆序,此时可对于外层循环的每次执行,内层循环条件a[j]>a[j+1]始终成立。及基本操作执行的次数为n-i。i的取值为0~n-1.因此基本操作的执行次数为:(n-1+1)(n-1)/2 = n(n-1)/2,时间复杂度为n的平方
2)最好的情况是本身就是有序的,时间复杂度为n
2. 空间复杂度分析
由代码可以看出,额外的辅助空间只有一个tmp,空间复杂度始终为O(1).
l 更多内存请关注
http://wenku.baidu.com/p/helpylee