冒泡排序,真的很简单,不是嘛,如果给你15分钟,也许你会很快就写出来一个,真的,我相信你,而且说不定考虑的还是相当周全滴,在此仅以此博客记录一下,我所认识的冒泡排序。
冒泡排序,为什么取这个名?
你可以想想池塘里的气泡,从最底部向最上部浮起的过程,是不是由小变大的过程中,这是一个物理知识,就不用说了吧,不知道的,回去看看初中科本吧,因此浮到水面的气泡是不是最大的,这也就是取名冒泡的原因啦,浮到最上面的就是最大的,当然你别认为冒泡只能实现从小到大排序,大与小本身就是一种相对概念~
冒泡排序的思路(从小到大排序)
1:比较相邻的元素,如果第一个元素比第二个元素小,就将其交换之
2:对每一对相邻元素都做同样的工作,从第一对直至最后一对
3:做完第2步,这里最大的元素已经浮至最上面的位置,去除最后一个元素,重新执行上面的步骤,如果所有相邻元素的比较过程中均没有交换发生,排序完成。
冒泡排序的时间复杂度
最好的情况下,是待排序的元素已经处于有序的状态,这里只需要n-1次比较就可以了,也不需要进行元素的交换,因此最好时间复杂度为O(n)
最坏的情况下,是待排序的元素处于逆序的状态,因此每次循环都需要进行n-i-1次比较,根据数学知识(高中的)可以得知总共需要的比较次数是n*(n-1)/2,对于每次的比软均需要3次移动交换操作,因此总共的移动交换操作数为3n*(n-1)/2.因此总共的时间复杂度为O(n^2)
因此算法的平均时间复杂度为O(n^2)
冒泡排序的空间复杂度
空间复杂度这个很好计算,看一眼就知道了吧,整个程序中就用到了一个变量,用于交换用,因此空间复杂度为O(1),但是不一定呦,下面有程序二将空间复杂度降为0
冒泡排序的稳定性
稳定性,这个也是显然的,是稳定的,两个相邻元素,如果是相等的,就不进行交换,除非是你有意为之~~~
普通的冒泡排序源程序
void BubbleSort(int *a ,int N) { bool flag=true; int tmp; for(int i=0;i<N;i++) { for(int j=0;j<N-i;j++) { if(a[j]>a[j+1]) { tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; flag=false; } } if(flag) break; } return ; }
更快的空间复杂度为0的冒泡排序
void BubbleSort(int *a ,int N) { bool flag=true; for(int i=0;i<N;i++) { for(int j=0;j<N-i;j++) { if(a[j]>a[j+1]) { a[j]=a[j]^a[j+1]; a[j+1]=a[j+1]^a[j]; a[j]=a[j+1]^a[j]; flag=false; } } if(flag) break; } return ; }
上面代码用到了异或操作,降低算法空间复杂度