排序原理
当我们对一个数组进行冒泡排序的时候,我们可以把数组中的每个元素看做是一个一个的气泡,元素值较大的我们看成是重气泡,元素值较小的我们看成是轻气炮。根据生活常识我们知道,在水里,轻气炮肯定排在重气泡的前边,我们如何将轻重气泡按照我们知道的生活常识方式进行排序呢。这种这种排序的方式我们成冒泡排序。
所谓的冒泡排序就是对数组中的元素进行两两比较,如:第一次排序的第一步是我们对数组下标为0和1的两个元素进行比较,第二步为如果下标为0的元素比下标为1的元素大,我们就交换他们的位置,否则什么做,继续进行下一次排序,下一次排序为下标为1的元素与下标为2的元素进行比较,然后重复第一次排序的第二个步骤,以此往复,直到内层循环结束,最重的气泡已经排在了最后了。然后外层循环进行下一次循环,直到整个外循环结束,数组就已经排好序了。冒泡排序是就地排序,是稳定的。冒泡排序属于交换排序的一种。
时间复杂度
- 当数组为有序的,只需要一趟排序,元素之间的比较次数为n-1次,移动元素的次时为0次,此时时间复杂度为O(n)。
- 当数组为反序的,需要n-1趟排序,每趟排序元素之间比较次数为n-i此,比较次数达到了最大值n*(n-2)/2,别切没元素的移动需要三个步骤,移动次数也达到了最大值3*n(n-2)/2,所以当数组反序的时候冒泡排序的时间复杂第为O(n2)。
排序代码
package com.alg.sort;
/**
* 冒泡排序
*/
public class BubbleSort {
/**
* 冒泡排序算法
*/
public void bubbleSort(int[] arr, int a, int n) {
for (int i = a; i < n; i++) {
//两两比较,并为之交换
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[i]) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
}
}