基本思路
- 算法示例地址:visualgo.net/en/sorting
示例要排序的数组为array,每个元素为item
第一次遍历,初始元素为第一个元素,比较与item相邻的元素是否小于item,如果小于,则交换两列,此时数> > 组最后一个元素一定是最大的元素。
以此类推,每次遍历都会将较大的数放到后面 该算法的实现中复杂度最坏情况为,最好的情况为
代码示例
public class BubbleSort {
public static void main(String[] args) {
int[] demo = {3,44,38,5,47,15,36,26};
System.out.println("排序前:" + Arrays.toString(demo));
sort(demo);
System.out.println("排序后:" + Arrays.toString(demo));
}
public static void sort(int[] array){
// 定义用于交换两列的临时变量
int temp;
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j+1]) {
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
}
缺点:在不论数据是什么,都会进行比较和循环,如果数组本来就是有序的情况下,依然会进行排序。 改进:在每一次遍历去比较相邻两个数时,如果没有一次交换两列的情况,也就是相邻两个数总是满足,前一个数小于后一个数,也就是说明数组本身就是有序的。这种情况可以直接输出结果,避免不必要的循环和比较
改进方案
public class BubbleSort {
public static void main(String[] args) {
int[] demo = {3,44,38,5,47,15,36,26};
System.out.println("排序前:" + Arrays.toString(demo));
sort(demo);
System.out.println("排序后:" + Arrays.toString(demo));
}
public static void sort(int[] array){
// 定义用于交换两列的临时变量
int temp;
// 标识是否是有序的,默认为true
boolean flag = true;
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j+1]) {
flag = false;
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
if (flag) {
break;
} else {
// 本次遍历是无序的,则置为true,查看下一次是否是有序的
flag = true;
}
}
}
}