vlambda博客
学习文章列表

算法入门-从冒泡排序开始

这个算法的名字由来,是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。


基本原理


冒泡排序应该是排序算法中比较简单的一种了,在面试中也经常会遇到这个算法题目,要求用任意一种语言写出冒泡排序的关键算法,所以熟悉一下这个基本的排序算法还是很有必要的。
冒泡排序原理就是在给出的序列中依次比较相邻的两个数字,如果第一个比第二个大,则交换它们,将大的数字放到右边,直到 从左往右是从小到大 的顺序。在给出的N个数的数列中,需要遍历 N-1 趟,每i趟需要遍历 N-i (1≤i≤n-1)次。


代码实现

首先假设给出一个待排序数列:[2, 4, 3, 9, 5, 7, 6 ],共7个数字。首先遍历第1趟,这一趟需要遍历所有数字,则需要遍历6次。将最大的数字9移动到最右后,第2趟则不需要在比较它了,所以第2趟需要遍历的次数为N-i-1(i从0开始)次,即5次。每进行一趟比较,都将最大的数字移动到最右,所以每一趟都会少一次,这样我们就很容易用代码实现了。
public static void main(String[] args) { //测试 int[] arr = new int[]{2, 4, 3, 9, 5, 7, 6}; int[] sortedArr = bubblingSort(arr); for (int i = 0; i < sortedArr.length; i++) { System.out.print(sortedArr[i]+",");//2,3,4,5,6,7,9, }  } /** * 冒泡排序 * @param arr * @return 排序后的数组 */ public static int[] bubblingSort(int[] arr) { //检查边界条件 if (arr == null || arr.length < 2) { return null; } int temp;    //关键算法 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]) {//交换两个数 temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } }    } return arr; }

时间复杂度


若给出的序列刚好是正序的,则时间复杂度C和记录移动次数M达到最小值,即C = N - 1,M = 0,这是最好的情况,即最好的时间复杂度为O(n)。
若序列是反序的,则需要进行N-1趟遍历排序,每趟排序需要进行N-i次数字的比较(1≤i≤n-1),且每次比较需移动记录3次达到交换记录位置,所以这种情况是时间复杂度达到最大值。所以冒泡排序的平均时间复杂度为:O(n2)。当比较相邻两个数,第一个数比第二个数小时,不会交换两个数,所以冒泡排序是一种稳定的排序排序算法。

写在最后


这可能是所有排序算法中最简单的一种了吧,虽说在工作中不一定能用到算法知识,但这对锻炼自己工作中实际解决难题的能力是很有帮助的,解决问题的方法也是算法的一种思想,所以很有必要继续学习研究算法相关知识。