步骤:
- 数列: 头..............尾
- 从数列尾部开始,相邻元素比较大小,小的向头移动
- 每一轮移动至头的数字按顺序排列下来
代码:
void BubbleSort(vector<int>& num){
int size = num.size();
for (int i = 0; i < size; i++){
for (int j = size - 1; j>i; j--){
if (num[j] < num[j - 1])
swap(num[j], num[j - 1]);
}
}
}
问题:
- 例如对于数列 2,1,3,4,5,6,7,8,9
只有第一轮从尾至头交换了1,2两个数字,其他的都是按顺序排好的,那么就浪费了很多时间
改进:
- 通过添加一个Flag,当从尾至头没有经过交换时直接退出循环
代码:
void BubbleSort(vector<int>& num){
int size = num.size();
int flag = 1;
for (int i = 0; i < size&&flag; i++){
flag = 0;
for (int j = size - 1; j>i; j--){
if (num[j] < num[j - 1]){
swap(num[j], num[j - 1]);
flag = 1;
}
}
}
}
不足:
- 十分浪费内存,繁杂
- 时间复杂度最好情况O(n),最坏情况O(n^2)