思想:两两比较相邻的关键字,如果反序则交换,直到没有反序的记录为止。
在了解冒泡排序之前,我们可以实现一个最简单的一个排序。
//排序算法中用的比较频繁
public static void swap(int[] test,int i,int j) {
int temp = test[i];
test[i] = test[j];
test[j] = temp;
}
public static void simpleSort(int[] test) {
for (int i = 0; i < test.length; i++) {
for (int j = i + 1; j < test.length; j++) {
if (test[i] > test[j]) {
swap(test, i, j);
}
}
}
}
上面代码很简单,它的思路就是让每一个关键字都和它后面的每一个关键字做比较,如果大则交换,这样第一位置的关键字在第一次循环过后一定变为最小值。但是这个算法效率是非常低的。
冒泡排序算法
这张图是大话数据结构书上的,帮助理解冒泡算法。
public static void bubbleSort(int[] test) {
for (int i = 0; i < test.length; i++) {
for (int j = test.length - 1; j > i; j--) {
if (test[j-1] > test[j]) {//如果前者大于后者,就冒泡浮出
swap(test, j-1, j);
}
}
}
}
冒泡排序优化
如果给定数组除了第一二位置需要交换,别的都已经有序,这时候仍然按照算法去执行的话,尽管不会有交换,但是比较的动作仍是多余。
public static void bubbleSort2(int[] test) {
boolean flag = true;
for (int i = 0; i < test.length && flag; i++) {
flag = false;
for (int j = test.length -1; j > i ; j--) {
if (test[j-1] > test[j]) {//如果前者大于后者,就冒泡浮出
swap(test, j-1, j);
flag = true;//如果有比较,发生过交换
}
}
}
}