冒泡排序(Bubble Sort)
-
简介:
冒泡排序是一种简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列)故名“冒泡排序”。
冒泡排序为非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
-
原理:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 -
示例:
public static void main(String[] args) { int[] array = new int[]{9, 5, 8, 4, 3, 7, 6, 1, 0, 2}; print("->排序前:", array); //第一层循环表示冒泡比较的轮数(2个数只需要比较1轮,3个数只需要比较2轮) //所以只需要比较 array.length - 1 轮. for (int i = 0; i < array.length - 1; i++) { //第二层循环表示本轮所需要比较的次数 //每一轮循环都会有一个较大值冒上来,仅需要比较其他其他较小的值, 所以需要比较 array.length - i - 1 次 for (int j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { int tem = array[j]; array[j] = array[j + 1]; array[j + 1] = tem; } } } print("->排序后:", array); }
输出结果:
->排序前:9,5,8,4,3,7,6,1,0,2 ->排序后:0,1,2,3,4,5,6,7,8,9
-
冒泡排序优化:
public static void sort(int[] arr) { //设置变量的初始值 int low = 0; int high = arr.length - 1; while (low < high) { int f1 = 0, f2 = 0; //每趟开始时,无记录交换 //正向冒泡,找到最大者 for (int i = low; i < high; ++i) { if (arr[i] > arr[i + 1]) { int tmp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = tmp; f1 = i; } } // 记录上次位置 high = f1; //反向冒泡,找到最小者 for (int j = high; j > low; --j) { if (arr[j] < arr[j - 1]) { int tmp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = tmp; f2 = j; } } //修改low值 low = f2; } } public static void main(String[] args) { int[] array = new int[]{9, 5, 8, 4, 3, 7, 6, 1, 0, 2}; print("->排序前:", array); sort(array); print("->排序后:", array); }
输出结果:
->排序前:9,5,8,4,3,7,6,1,0,2 ->排序后:0,1,2,3,4,5,6,7,8,9
冒泡排序优化代码引用自:Java实现经典排序算法----1、冒泡排序
-
口诀:
外层循环 n-1 (比较轮数)
内层循环 n-1-i (每一轮所比较的次数)
两两比较做交换