冒泡排序的代码, 上学时候, 入门C语言的最简单的算法, 相信大家也都很常见, 这里就不多做赘述, 看代码吧.
代码中需要注意的是: 如果在循环过程中没有了交换, 说明, 已经没有必要继续执行下去了, 也就是已经排好序了, 直接返回, 所以代码中放了一个"数据交换标志位".
public class BubbleSort {
/**
* 执行冒泡排序
* @param arrays 待排序数组
* @param order 正序or逆序
* @return
*/
public static int[] sort(int[] arrays, boolean order) {
// 1, 特殊情况, 数组的长度小于等于1, 没有必要排序, 直接返回
if (arrays.length <= 1) {
return arrays;
}
// 2, 根据order确定是正序, 还是倒序
int flag = order ? 1 : -1;
// 3, 数据交换标志位
boolean change = false;
int temp = 0;
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays.length - i - 1; j++) {
if (flag * (arrays[j] - arrays[j + 1]) > 0) {
temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
change = true;
}
}
// 优化, 如果没有数据交换, 则提前退出
if (!change) {
break;
}
}
return arrays;
}
/**
* 执行冒泡排序
* @param arrays 待排序数组
* @return
*/
public static int[] sort(int[] arrays) {
return sort(arrays, true);
}
}
空间复杂度: O(1), 因为是就地排序;
时间复杂度: O(n^2) <-- 平均时间复杂度