常用排序算法-冒泡排序
介绍
冒泡排序算法是一种简单的排序算法,它在重复的访问要排序的元素时,会依次比较相邻的两个元素,以升序为例,如果左边的元素大于右边的元素,就交换两个元素的位置,如此重复,直到没有相邻的元素需要交换位置,则排序完毕。
在排序的过程中,每一轮交换都会将最大的元素移动到数组的末端(升序),如同气泡上浮一般,所以称之为冒泡排序。
原理
下表是对[4,5,6,3,2,1]进行冒泡排序,每次都将当前数据和下一个数据进行比较,以升序为例,如果当前数据比下一个数据大,则交换两个数据的位置,否则不做任何处理。通过第一趟排序将最大值6放置在最后一个位置,第二趟将5放置在倒数第二个位置,依次类推,直到所有的数据都排序完成。
初始 | 4 | 5 | 6 | 3 | 2 | 1 |
第1趟 | 4 | 5 | 3 | 2 | 1 | 6 |
第2趟 | 4 | 3 | 2 | 1 | 5 | 6 |
第3趟 | 3 | 2 | 1 | 4 | 5 | 6 |
第4趟 | 2 | 1 | 3 | 4 | 5 | 6 |
第5趟 | 1 | 2 | 3 | 4 | 5 | 6 |
程序
public class BubbleSort { public static void bubbleSort(int [] arr){ for(int i = 0; i < arr.length - 1; ++i){ for(int j = 0; j < arr.length - i - 1; ++j){ if(arr[j] > arr[j + 1]) swap(arr, j, j + 1); } } } private static void swap(int[] arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
总结
冒泡排序的时间复杂度最差为O(n^2),最好情况时O(n),平均时间复杂度为O(n^2)。
同时冒泡排序是在原数组上直接进行操作,空间复杂度是O(1)。
由于元素的排序是相邻两元素交换得到的,所以冒泡排序是稳定的。
小优化:对于如[1,2,3,4,5,6]这种已经排序好了的数组,我们可以设置一个标志位,用来判断本轮排序是否对元素进行了交换,如果没有交换,表示此时剩下的元素已经排好序了,直接返回即可,这也就是冒泡排序最好的情况。