冒泡排序 BubbleSort :
1.对序列中的数据,依次比较相邻两个元素的大小;2.如果前边的大于后边的数据,则交换二者;
1.一种交换排序;
序列中每个元素,分别和后边的剩余元素比较,较小的元素冒上去;算法易懂,但效率极低
2.正宗冒泡排序:
反向,每次从最后一个元素开始,分别和它前边的元素进行比较,较小的冒上去;j>i,效率提高了;
3.优化的冒泡排序:
增加标记Flag变量,在最外层的循环中设置判断,若Flag为True,则序列已经有序无需对元素比较判断,退出循环;.
//三种冒泡排序算法比较
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
void BubbleSortLow(vector <int> chaosData, int num);
void BubbleSortMid(vector <int> chaosData, int num);
void BubbleSortHight(vector <int> chaosData, int num);
int SwapNum(int &num1, int &num2);
int main()
{
int num = 10;
srand((unsigned)time(NULL));
cout << "功能:对数据从大到小排序\n" << endl;
vector <int> chaosData;
for (int i = 0; i != num; ++i)
{
chaosData.push_back(rand() % 100); //产生0~100的整型数据
}
cout << "排序前数据为:" << endl;
for (auto c : chaosData)
{
cout << c << " ";
}
cout << endl << "1.效率较低的一种冒泡排序:" << endl;
clock_t clockLowB = clock();
BubbleSortLow(chaosData, num);
clock_t clockLowE = clock();
cout << "第1种方法运行时间为:" << (double)(clockLowE - clockLowB) / CLOCKS_PER_SEC * 1000 << "秒" << endl;
cout << endl << "2.正宗的一种冒泡排序:" << endl;
clock_t clockMidB = clock();
BubbleSortMid(chaosData, num);
clock_t clockMidE = clock();
cout << "第2种方法运行时间为:" << (double)(clockMidE - clockMidB) / CLOCKS_PER_SEC * 1000 << "秒" << endl;
cout << endl << "3.优化后的一种冒泡排序:" << endl;
clock_t clockHighB = clock();
BubbleSortHight(chaosData, num);
clock_t clockHighE = clock();
cout << "第3种方法运行时间为:" << (double)(clockHighE - clockHighB) / CLOCKS_PER_SEC * 1000 << "秒" << endl;
system("pause");
return 0;
}
// 0.交换两个整型数据
int SwapNum(int &num1, int &num2)
{
int tempNum = 0;
tempNum = num1;
num1 = num2;
num2 = tempNum;
return 0;
}
// 1.效率较低的一种冒泡排序
void BubbleSortLow(vector <int> chaosData, int num)
{
for (int i = 0; i != num-1; ++i)
{
for (int j = i + 1; j != num; ++j)
{
if (chaosData[i] > chaosData[j])
{
SwapNum(chaosData[i], chaosData[j]);
}
}
}
cout << "排序后数据为:" << endl;
for (auto c : chaosData)
{
cout << c << " ";
}
}
// 2.正宗的一种冒泡排序:
void BubbleSortMid(vector <int> chaosData, int num)
{
for (int i = 0; i != num-1; ++i)
{
for (int j = num - 1; j >= i; --j) // j>i
{
if (chaosData[i] > chaosData[j])
{
SwapNum(chaosData[i], chaosData[j]);
}
}
}
cout << "排序后数据为:" << endl;
for (auto c : chaosData)
{
cout << c << " ";
}
}
// 3.优化后的一种冒泡排序:
void BubbleSortHight(vector <int> chaosData, int num)
{
int flag; // 为1则已经有序
// cout << "未排序:" << endl;
// for (auto c : chaosData)
// {
// cout << c << " ";
// }
// cout << "\n排序后" << endl;
for (int i = 0; i != num - 1; ++i) // 循环判断:i未至最大数值 且 此时无序;flag为1则跳出循环
{
flag = 1; //无序
for (int j = i+1; j != num; ++j)
{
if (chaosData[i] > chaosData[j])
{
SwapNum(chaosData[i], chaosData[j]);
flag = 0;
}
}
// cout << "\ni=" << i << " flag=" << flag << endl;//调试用
// for (auto c : chaosData)
// {
// cout << c << " ";
// }
if (flag == 1)
break;
}
cout << "排序后数据为:" << endl;
for (auto c : chaosData)
{
cout << c << " ";
}
}