排序算法2 - 冒泡排序
算法思路
依次比较相邻的元素,如果前一个元素比后一个元素大,则交换位置
第一轮排序结束后,最后一个元素就会是最大的数
比较剩下的数组元素(第 1 位到第 n - 2 位 ),方式同第一轮比较一样
以此类推,直到所有元素均排序完毕
代码实现
public void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
// 这种写法比较抖机灵,不推荐,只是为做个介绍
public void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
复杂度分析
时间复杂度为 O(N²) (第一次比较 n 个数,第二次比较 n-1 个数,第三次比较 n-2 个数... 呈等差数列分布,所以复杂度为 an² + bn + c 的格式)
不占用额外的内存空间
优化算法
冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。
额外知识点: 元素交换
这里的交换方法(swap) 和我们平常写的不太一样,看上去似乎很有逼格,这是通过异或运算实现的,具体实现原理见算法之异或运算及其运用
欢迎大家来我博客逛逛 mmimo技术小栈