本文参考动图来自公众号:吴师兄学算法。看动图,学算法,认准吴师兄~
冒泡算法方法原理
冒泡排序是一种简单的排序算法,它也是一种稳定排序算法(一般情况下,称某个排序算法稳定,指的是当待排序序列中有相同的元素时,它们的相对位置在排序前后不会发生改变。)其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换(这个过程我们成为比较的次数)。一直重复这个过程(我们称之为比较的轮数),直到没有任何两个相邻元素可以交换,就表明完成了排序。算法过程如下图所示:
由于该排序算法的每一轮要遍历所有元素,轮转的次数和元素数量相当,所以时间复杂度是O(N^2)
冒泡算法代码实现
public class DemoTest {
public static void main(String[] args) {
//定义一个数组
int[] arr = {20, 34, 14, 75, 26, 72, 61};
System.out.println("排序前:" + Arrays.toString(arr));
/* 为什么是arr.lenth-1? 因为如果是arr.length会导致“数组下标越界”错误。
* 冒泡算法每次比较的时候,都和下一个元素进行比较,
* 到arr.length-1那个元素的时候,就会和arr.length那个元素比较,
* 因此i只需要到arr.length-1就可以了
*/
for (int i = 0; i < arr.length-1; i++) {
/* 内层循环是每轮比较次数
* 为什么是arr.lenth-1-i?
* 为什么-1:因为如果是arr.length会导致“数组下标越界”错误。
* 冒泡算法每次比较的时候,都和下一个元素进行比较,
* 到arr.length-1那个元素的时候,就会和arr.length那个元素比较,
* 因此i只需要到arr.length-1就可以了;
* 为什么-i:因为第一轮比较(此时i=0)我们需要比较arr.length-1次,
* 第二轮比较的时候(此时i=1),我们已经比完一个元素了,剩下需要比较的次数应该减掉这个已经比完的也就是arr.length-1-1;
* 第三轮比较的适合(此时i=2),我们已经比完两个元素了,剩下需要比较的次数应该减掉这两个已经比完的也就是arr.length-1-2;
* 找规律可知,需要比较的次数应该是:arr.length-1-i;
* */
for (int j = 0; j < arr.length-1-i; j++) {
if (arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println("排序后:" + Arrays.toString(arr));
}
}