思路
依次比较两个相邻的元素,若前者较大则交换两个元素的位置。每一趟比较都能确定一个元素的位置(较大的),因此每趟需比较n-i次(n为元素个数,i为趟数),最坏情况下需要进行n(n-1) / 2次比较。最好情况只需n-1次比较。
以数组{1,2,0,5,9,3}为例:
第一趟排序:1 0 2 5 3 9 元素9位置确定
第二趟排序:0 1 2 3 5 9 元素5位置确定
第三趟排序:0 1 2 3 5 9 未发生交换,排序结束。
C++实现
template <typename T>
vector<T> bubberSort(vector<T> a) {
bool flag = true;
for(int i = 0; flag && i < a.size() - 1; ++i) {
flag = false;
for(int j = 0; j < a.size() - i - 1; ++j) {
if(a[j] > a[j + 1]) {
flag = true;
swap(a[j], a[j + 1]); //交换
}
}
} // end for(int i)
return a;
}
总结
- 冒泡排序为稳定排序
- 冒泡排序每一趟都能确定一个元素的位置
- 冒泡排序的最坏、最好和平均时间复杂度依次为O(n2)、O(n)、O(n2)