一 冒泡排序的基础

冒泡排序的原理基础,是按顺序让元素互相比较,直到第一次循环的元素的下标位,然后进行循环比较直到结束。
冒泡排序基础语法:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<int> obj;
obj.push_back(11);
obj.push_back(1);
obj.push_back(19);
obj.push_back(45);
obj.push_back(8);
int len = obj.size();
for(int i = 0; i < len - 1; ++i)
{
for(int j = 0; j < len - 1 - i; ++j)
{
if(obj[j] >obj[j+1])
{
swap(obj[j],obj[j+1]);
}
}
}
for(auto it = obj.begin(); it != obj.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
第一种方法:
设置标记:因为冒泡是on2的循环,不管该对象是不是已经完全排序都会循环完。我们在判断顺序排序时加入标记,得到标记时未变化,则可知剩余排序都已经正常顺序。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<int> obj;
obj.push_back(11);
obj.push_back(1);
obj.push_back(19);
obj.push_back(30);
obj.push_back(8);
obj.push_back(20);
obj.push_back(45);
obj.push_back(65);
int len = obj.size();
for(int i = 0; i < len - 1; ++i)
{
int flag = -1;//加入标记
for(int j = 0; j < len - 1 - i; ++j)
{
if(obj[j] >obj[j+1])
{
swap(obj[j],obj[j+1]);
flag = 0;
}
}
if(flag == -1)//判断标记是否生效
{
break;
}
}
for(auto it = obj.begin(); it != obj.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
第二种方法:
进行双向冒泡。则只需要之前的1/2的时间。例如:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<int> obj;
obj.push_back(11);
obj.push_back(1);
obj.push_back(19);
obj.push_back(30);
obj.push_back(8);
obj.push_back(20);
obj.push_back(45);
obj.push_back(65);
int len = obj.size();
int num = 0;
for(int i = 0; i < len / 2; ++i)//双向的话,就等于前后一起,只需要进行1/2的循环即可
{
for(int j = 0; j < len - 1 - i; ++j)//从前往后循环判断
{
if(obj[j] >obj[j+1])
{
swap(obj[j],obj[j+1]);
}
}
for(int k = len - 1 - i; k > 0; k--)//从后往前循环判断
{
if(obj[k] < obj[k-1])
{
swap(obj[k],obj[k-1]);
}
}
num++;
}
for(auto it = obj.begin(); it != obj.end(); ++it)
{
cout << *it << endl;
}
cout << "num = " << num << endl;
return 0;
}
第三种优化:
最节省时间的优化—— 在进行双向冒泡的同时,也进行标记。 例如:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<int> obj;
obj.push_back(11);
obj.push_back(1);
obj.push_back(19);
obj.push_back(30);
obj.push_back(8);
obj.push_back(20);
obj.push_back(45);
obj.push_back(65);
int len = obj.size();
int num = 0;
for(int i = 0; i < len / 2; ++i)//双向的话,就等于前后一起,只需要进行1/2的循环即可
{
int flag = 0;
for(int j = 0; j < len - 1 - i; ++j)//从前往后循环判断
{
if(obj[j] >obj[j+1])
{
swap(obj[j],obj[j+1]);
flag = 1;
}
}
for(int k = len - 1 - i; k > 0; k--)
{
if(obj[k] < obj[k-1])
{
swap(obj[k],obj[k-1]);
flag = 1;
}
}
if(!flag)
{
break;
}
num++;
}
for(auto it = obj.begin(); it != obj.end(); ++it)
{
cout << *it << endl;
}
cout << "num = " << num << endl;
return 0;
}```
本文介绍了冒泡排序的基础原理,并探讨了三种优化方法。包括设置标记以提前结束循环,实现双向冒泡减少比较次数,以及结合双向冒泡与标记优化,进一步节省时间。这些策略旨在提高冒泡排序的效率。
1239

被折叠的 条评论
为什么被折叠?



