最简单的冒泡排序:
public void sort(int[] a) {
for (int i = a.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
外层循环优化:用flag标志位来判断是否已经有序,不必继续遍历(增加一个变量,典型的空间换时间,增加了时间复杂度的稳定性)
public void sort(int[] a) {
for (int i = a.length - 1; i > 0; i--) {
boolean flag = true;
for (int j = 0; j < i; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = false;
}
}
if (flag) {
break;
}
}
}
内层循环再优化:用pos标志位来判断内层循环需要跑到那个位置结束(增加一个变量,典型的空间换时间,增加了时间复杂度的稳定性)
public void sort(int[] a) {
int pos = 0;
int k = a.length - 1;
for (int i = 0; i < a.length - 1; i++) {
boolean flag = true;
for (int j = 0; j < k; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
pos = j;
flag = false;
}
}
if (flag) {
return;
}
k = pos;
}
}