算法思路:
重复走访每两个相邻元素,比较大小交换位置,直至排序完成。
有兴趣电话可以看一下这个【冒泡排序踢踏舞】的视频,很形象的演示了排序过程,额呵呵~~
性质:
冒泡排序是一种原地排序(只有常数个元素存到数组以外的空间),最坏的时间复杂度,和平均时间复杂度都是n2。冒泡法是稳定的。。
*注:
冒泡排序是算法入门级别,是面试笔试时候的禁术,古往今来死在冒泡法上的应届生真可谓前仆后继...
代码:
int[] BubbleSort1(int[] a) { int num; for (int i = a.Length-1; i>0; i--) //外层循环,每一轮把最大的元素换到最后,下一轮少排一个元素 { for (int j = 0; j < i; j++) { if (a[j] > a[j + 1]) { num = a[j]; a[j] = a[j + 1]; a[j + 1] = num; } } } return a; }
改进:
因为冒泡法会机械而重复的完成所有比较,比如对{10,1,2,3,4,5,6}这个数组的排序,实际上第一轮过后,就已经排好了,但程序还是把没有意义的比较进行到底。。。
于是可以加一个开关变量,在某一轮没有发生交换的情况下,结束排序,如下:
int[] BubbleSort2(int[] a) { int num; for (int i = a.Length-1; i>0; i--) { bool isOver=true; for (int j = 0; j < i; j++) { if (a[j] > a[j + 1]) { num = a[j]; a[j] = a[j + 1]; a[j + 1] = num; isOver = false ; } } if (isOver) break; //没有发生交换则结束 } return a; }