排序原理:
将临近的两个元素互相比较,将大的元素放在后面,依次循环下去,第一趟完成比较后,最大的元素会排在最后,第二趟后第二大的元素会排在倒数第二位,n-1趟后元素全部被排完。
图解:
(假设原数组为:5,2,4,6,3,1)
代码实现:
void BubbleSort(vector<int>& v, int left, int right){
for (int i = left; i < right; i++){
for (int j = left; j < right - i - 1; j++){
if (v[j] > v[j + 1]){
swap(v[j], v[j + 1]);
}
}
}
}
int main()
{
int size = 0;
cin >> size;
vector<int> v(size, 0);
for (int i = 0; i < size; i++){
cin >> v[i];
}
BubbleSort(v, 0, size);
for (auto& e : v){
cout << e << " ";
}
system("pause");
return 0;
}
改进:
设置一个标志位 flag,用于标志此趟排序是否有交换,如果有则说明整体数据未必有序,若没有则说明数据已经有序,直接退出
代码:
void BubbleSort1(vector<int>& v, int left, int right){
bool flag = false;
for (int i = left; i < right; i++){
for (int j = left; j < right - i - 1; j++){
if (v[j] > v[j + 1]){
swap(v[j], v[j + 1]);
flag = true;
}
}
if (!flag){
break;
}
else
flag = false;
}
}
结果展示:
特性总结:
- 时间复杂度:O(N^2)
- 空间复杂度:O(1)
- 是一种稳定的排序算法