冒泡排序
冒泡排序
- 原理
- 每一次遍历序列,只能确定一个元素的正确位置
- 第一次将末位元素归位,第二次将倒数第二位元素归位...
- 设\(n\)个元素排序,只需要将\(n-1\)个元素归位
- 每一次比较相邻元素,若相邻元素逆序,则交换元素位置
代码实现
public class Solution {
public void bubbleSort(int[] arr) {
int n = arr.length;
for (int end = n - 1; end >= 0; end--) {
for (int second = 1; second <= end; second++) {
if (arr[second] < arr[second - 1]) {
int temp = arr[second];
arr[second] = arr[second - 1];
arr[second - 1] = temp;
}
}
}
}
}
-
总结
- 外层循环用来控制排序的次数,\(n\)个元素排序,只需要将\(n-1\)个元素归位
- 比较区间:\([0,n-1],[0,n-2],[0,n-3],...,[0,1]\)
- 每次外层循环开始,从第二个元素开始比较(索引为\(1\)),到最后一个元素结束(索引为\(n-1\))
-
时间复杂度分析
根据冒泡排序关键循环,有
\[\sum\limits_{i=0}^{n-1}\sum\limits_{j=1}^{i}1=\sum\limits_{i=0}^{n-1}(i-1+1)=\frac{n(n-1)}{2}=\frac{1}{2}n^2-\frac{1}{2}n \]因此,冒泡排序的时间复杂度为\(O(n^2)\)