冒泡排序
原理:比较两个相邻的元素,将值大的元素交换至右端。
思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
N个数要执行N-1次排序,每次排序内层循环为N-i次
冒泡的时间复杂度:最好的情况是O(n),最坏的情况是O(n2)
代码:
int[] arr = {10, 20, 5, 7, 4, 65, 47, 30};
for (int i = 0; i < 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));
冒泡排序性能优化:增加flag标识位
int[] arr = {10, 20, 5, 7, 4, 65, 47, 30};
boolean flag ;
for (int i = 0; i < arr.length - 1; i++) {
flag = true;
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;
flag = false;
}
}
if (flag) {
break;
}
System.out.println(i);
}
System.out.println(Arrays.toString(arr));
结果:
0
1
2
3
[4, 5, 7, 10, 20, 30, 47, 65]
可以看出优化确实起了作用,只执行了4次外层循环就排序完成。