基本思想
冒泡排序的思想和其名字一样直观,把整个表看作一个水池,数据看作石头,重的自然沉下去而轻的会浮上来。当然在程序里面,直接沉下去和直接浮上来都是不可能的,因此冒泡排序就是相邻元素进行比较,如果逆序了,就相互交换,如此迭代直到序列有序为止。
冒泡排序每次迭代产生的有序区都是有序的(注意参考下面的实现理解)。
实现
template<typename _Ty>
void bubble_sort(std::vector<_Ty> & a){
for (int i = 0; i < a.size() - 1; i++){
for (int j = a.size() - 1; j > i; j--)
if (a[j] < a[j - 1])
std::swap(a[j], a[j - 1]);
output_list(a);
}
}
对于一组测试数据5 4 11 18 1 70 35 90 100 2
,输出每一次迭代的结果如下:
1 5 4 11 18 2 70 35 90 100
1 2 5 4 11 18 35 70 90 100
1 2 4 5 11 18 35 70 90 100
1 2 4 5 11 18 35 70 90 100
1 2 4 5 11 18 35 70 90 100
1 2 4 5 11 18 35 70 90 100
1 2 4 5 11 18 35 70 90 100
1 2 4 5 11 18 35 70 90 100
1 2 4 5 11 18 35 70 90 100
时间空间复杂度及稳定性
冒泡排序使用了两层循环,第一层循环迭代n−1次,而内层循环则每次从最后一个元素开始迭代到当前i的位置之前。因此不难得出总的时间复杂度是if
语句跟是否已经有序没有影响),都满足O(n2)的时间复杂度。
空间复杂度是O(1)的,因为只用了几个临时变量。
稳定性来说,冒泡排序是稳定的。设A[t1]=A[t2],其中t1<t2,那么A[t2]所对应的元素被冒泡到A[t1+1]时,就不满足if
语句的条件,也就不会被换到A[t1]之前。