冒泡排序是最常使用的一种排序算法,算法思想是从头到尾遍历数组,将相邻的两个值进行比较,小的放在前面,大的放在后面。
这样第一趟排序之后,最后一个位置所放的元素就是最大的值,第二趟排序之后,倒数第二个元素也排好了。经过n次排序之后,所有的值就排序完成了。
比如无序数组 3,1,4,2,5
第一躺 1,3,2,4,5
第二趟 1,2,3,4,5
这样排序就完成了,代码实现也很简单,使用双重for循坏即可
时间复杂度 O(n^2) 空间复杂度 O(1) 具有稳定性
public static <T extends Comparable> void bubbleSort(T[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j].compareTo(arr[j + 1]) > 0) {
swap(arr, j, j + 1);
flag = true;
}
}
}
}
算法优化:上面的例子,其实只进行了两趟排序,但是for循环持续了5次,所以可以在中间加入一个变量flag来判断是否发生交换,如果一趟下来没有发生交换,则说明该数组已经是有序的,直接跳出循环。
此时的最优时间复杂度 O(n)
public static <T extends Comparable> void bubbleSort(T[] arr) {
boolean flag = false;
for (int i = 0; i < arr.length; i++) {
flag = false;
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j].compareTo(arr[j + 1]) > 0) {
swap(arr, j, j + 1);
flag = true;
}
}
if (!flag) {
return;
}
}
}
交换swap代码
private static <T>void swap(T[] arr,int i, int j) {
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}