一)定义
将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
冒泡排序属于交换排序,交换排序主要是根据记录的关键字的大小,将记录交换来进行排序的。交换排序的特点是:将关键字值较大的记录向序列的后部移动,关键字较小的记录向前移动。交换排序方法包括冒泡排序和快速排序。
二)冒泡排序的实现(java)
package com.fox; import java.util.Random; public class BubbleSort { public static void sort(int[] a) { for (int i = 0; i < a.length - 1; i++) { for (int j = 0; j < a.length - 1 - i; j++) { if (a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } } /** * @param args */ public static void main(String[] args) { int[] a = new int[100000]; Random random = new Random(); for (int i = 0; i < a.length; i++) { a[i] = random.nextInt(100000); } // a = new int[] { 6, 7, 51, 2, 52, 8 }; long bt = System.currentTimeMillis(); BubbleSort.sort(a); System.out.println(System.currentTimeMillis() - bt); // for (int a_ : a) // System.out.println(a_); } }
该算法的时间复杂度为O(n2)。上面的算法还可以做出一定优化,就是第二层循环内如果没有进行交换,则说明已经全部有序,可以直接退出。
public static void sort(int[] a) { for (int i = 0; i < a.length - 1; i++) { int flag = 0; for (int j = 0; j < a.length - 1 - i; j++) { if (a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; flag++; } } if (flag == 0) break; } }
在极端情况下,待排序数组本来就有序(升序),那么改进后的算法时间复杂度为O(n)。