什么是冒泡排序?冒泡排序的基本思想就是每次比较相邻的元素,如果相邻的两个元素顺序错误就将两个元素进行交换
举个例子,对一下数组按照冒泡排序的方式进行从大到小排序
[12,23,13,45,34]
第一趟,首先第一位会和第二位进行比较,12<23,进行交换,交换之后,12和13进行比较,知道将最小值交换至最后的位置上。
[12,23,13,45,34]
[23,12,13,45,34]
[23,13,12,45,34]
[23,13,45,12,34]
[23,13,45,34,12]
将以上的交换的过程,旋转一下方向就会发现,交换的过程就像水缸里面的气泡一样,从底部逐渐的向上漂浮。
第二趟比较,第一位23和第二位13进行比较,23>13,不进行交换,第二位13和第三位45进行比较,13<45,进行交换,第二趟最终的交换结果如下,有一点需要注意最后一位12在第一趟比较中已经是最小的了,因此13只需要放置到第四个位上即可,无需与最后一位进行比较,也就是说:当你的数组中有N个数进行排序时,只需要将N-1个数进行归位,也就是需要进行N-1趟操作:
[23,45,34,13,12]
从其他地方copy了一个动图示意:
代码实现:
// 定义冒泡排序方法
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]){
int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp;
}
}
}
}
时间复杂度怎么算?就拿上边5个元素的数组来说,第一趟需要比较4次,第二趟需要比较3次,第三趟需要比较2次,第四趟需要比较1次,最终的时间复杂度是 4+3+2+1,那如果有N个数呢?那就是 N-1 + N-2 + N-3 + .....+ 1,是一个等差数列,进行求和的结果就是如下图,那么时间复杂度就是O(N^2):