思路
- 对数组进行遍历,分别比较当前索引和下一个索引处的值大小,把大的(或小的)放到后面,那么最后一个就是最大的(或最小的),然后再进行下一次遍历
- 因为第一次遍历已经把最大的(或最小的)放到了最后一个,所以第二次不需要对最后一个索引处的数进行比较
- 以此类推,直到所有元素均排序完毕
Code
public class BubbleSort {
public void sort(int[] arr) {
if (ArrayUtils.isEmpty(arr) || arr.length == 1) {
return;
}
int len = arr.length - 1;
for (int i = 0; i < len; i++) {
for (int j = 0; (j < len - i); j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
private void swap(int[] arr, int index, int target) {
int temp = arr[index];
arr[index] = arr[target];
arr[target] = temp;
}
}
优化
当在进行某一次遍历寻找最大的值时候,如果此次遍历没有进行过位置的互换,那么表示当前数组已经有序了,所以就可以直接返回
public class BubbleSort {
public void sort(int[] arr) {
if (ArrayUtils.isEmpty(arr) || arr.length == 1) {
return;
}
int len = arr.length - 1;
for (int i = 0; i < len; i++) {
//用来标记数组是否已经有序
boolean flag = true;
for (int j = 0; j < len - i; j++) {
if (arr[j] > arr[j + 1]) {
//进行交换了,表示还不是有序
flag = false;
swap(arr, j, j + 1);
}
}
if (flag) {
//如果有序,直接返回
return;
}
}
}
private void swap(int[] arr, int index, int target) {
int temp = arr[index];
arr[index] = arr[target];
arr[target] = temp;
}
}
-
时间复杂度:O(N^2)
-
空间复杂度:O(1)
-
稳定性:稳定