是否原地排序? | 是否稳定? | 最好 | 最坏 | 平均 | |
冒泡排序 | 是 | 是 | O(n) | O(n^2) | O(n^2) |
插入排序 | 是 | 是 | O(n) | O(n^2) | O(n^2) |
选择排序 | 是 | 不是 | O(n^2) | O(n^2) | O(n^2) |
归并排序 | 不是 | 是 | O(nlogn) | O(nlogn) | O(nlogn) |
快速排序 | 是 | 不是 | O(nlogn) | O(n^2) | O(nlogn) |
冒泡排序
算法
冒泡排序只会操作相邻的两个数据。算法每次对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让他们两互换。一次冒泡会让至少一个元素移动到他所应该在的位置,重复n次,就完成了n个数据的排序工作。
优化:记录有没有数据交换。若无数据交换,在执行n次之前,可提前结束排序。
// 冒泡排序,a 表示数组,n 表示数组大小
public void bubbleSort(int[] a, int n) {
if (n <= 1) return;
for (int i = 0; i < n; ++i) {
// 提前退出冒泡循环的标志位
boolean flag = false;
for (int j = 0; j < n - i - 1; ++j) {
if (a[j] > a[j+1]) { // 交换
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag = t