一.排序方法
- 将被排列的数组data[0...n]垂直排列,每个元素data[i]看作是一个气泡,气泡的重量就是data[i]的值。
- 从最下面一个气泡data[n]开始扫描,比较其与上一个气泡data[n-1]的重量,data[n] < data[n-1]则交换;然后比较data[n-1]与data[n-1-1]...一轮下来,最轻的气泡跑到了最上面data[0]的位置。
- 重复2过程,让第二轻的气泡跑到data[1]的位置;再次重复...
二.动画演示
http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/maopaopaixu.htm
三.Java代码
- public static int[] bubbleSort(int[] data) {
- int temp = 0;
- for(int i=0; i < data.length -1; i++) { //每一轮
- boolean exchange = false; //每一轮设置一个是否有元素交换的标志
- int j = data.length -1;
- for(; j > i; j--) {
- if(data[j] < data[j-1]) { //元素和上一个元素比较
- temp = data[j];
- data[j] = data[j-1];
- data[j-1] = temp;
- exchange = true; //有元素交换
- }
- }
- if(!exchange) { //如果一轮下来,没有元素交换,说明data已经是排好序了,无需进行下一轮
- break;
- }
- }
- return data;
- }
四.时间复杂度和稳定性
- 最好时间复杂度
- 若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值。
- Cmin=n-1=O(n)
- Mmin=0
- 冒泡排序最好的时间复杂度为O(n)
- 最坏时间复杂度
- 若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值。
- Cmax=n(n-1)/2=O(n2)
- Mmax=3n(n-1)/2=O(n2)
- 冒泡排序的最坏时间复杂度为O(n2)
- 平均时间复杂度
- O(n2)
- 冒泡排序是就地排序,且它是稳定的。
五.算法优化
- 设置exchange标志。如果不设置,Cmin=n(n-1)/2=O(n2)