基本思想:假设待排序表长为n,从后往前(或从前日后)两两比较相邻元素,若是是逆序(A[i-1] > A[i]),那么交换这两个元素,直到序列比较完。这是一趟冒泡,将最小的元素交换到待排序列的第一个位置(最小元素如同气泡同样逐渐往上“漂浮”直至“水面”,这是冒泡排序名字的由来)。下一趟冒泡时,前一趟肯定的最小元素再也不参与比较,待排序列减小了一个元素,每趟冒泡把待排序列中的最小元素放到了最终位置上,最多作n-1趟冒泡就能完成排序任务。冒泡排序产生的有序子序列是全局有序的,由于有序子序列中的全部元素小于或大于无序子序列中的全部元素,每一趟排序都会将一个元素放到最终位置上。html
1 public class BubbleSort { 2 public static void bubbleSort(int[] arr) { 3 if (arr == null || arr.length <= 1) { 4 return; 5 } 6 7 int maxIndex = arr.length - 1; 8 for (int i = 0; i < maxIndex; i++) { 9 // 本趟冒泡是否发生交换的标志 10 boolean isSwap = false; 11 // 一趟冒泡过程 12 for (int j = maxIndex; j > i; j--) { 13 // 若是相邻元素出现逆序 14 if (arr[j - 1] > arr[j]) { 15 // 交换相邻元素 16 int temp = arr[j - 1]; 17 arr[j - 1] = arr[j]; 18 arr[j] = temp; 19 20 isSwap = true; 21 } 22 } 23 24 // 若是本趟冒泡没有发生交换,说明表已经有序 25 if (!isSwap) { 26 return; 27 } 28 } 29 } 30 31 public static void main(String[] args) { 32 int[] arr = {1, -1, 3, 2, -3}; 33 BubbleSort.bubbleSort(arr); 34 for (int item : arr) { 35 System.out.print(" " + item); 36 } 37 } 38 }
输出结果:算法
-3 -1 1 2 3
冒泡排序性能分析:数据结构
空间复杂度:仅使用了常数个辅助单元,空间复杂度为O(1)。性能
时间复杂度:当初始序列有序时,第一趟冒泡后发现没有交换元素,跳出循环,比较次数为n-1,移动次数为0,即最好状况下的时间复杂度为O(n)。当初始序列逆序时,须要n-1趟排序,第i趟排序要进行n-i次元素比较,并且每次比较后移动元素3次来交换元素。在这种状况下,spa
因此,最好状况下时间复杂度为O(n),最坏状况下时间复杂度为O(n2),平均状况下时间复杂度为O(n2)。code
稳定性:由于当i>j且A[i]=A[j]时,不会交换元素,因此冒泡排序是稳定的。htm
参考资料blog
《2017年数据结构联考复习指导》 P287排序