数据结构与算法:2,冒泡排序
以从小到大排序为例:
冒泡排序步骤:
1,从左到右(或从右到左)对比相邻两个数,左边的数 大于 右边的数 则交换位置
2,重复第一个步骤
看代码:
1,从左到右(或从右到左)对比相邻两个数,左边的数 大于 右边的数 则交换位置
#include<iostream>
int main()
{//示例 从小到大排序
int x[10] = { 3,4,45,5,43,23,24,2543,25,342 };
for (int i = 0;i < 10;i++)
{
if (i == 9)break;//最后一个值 没有i+1 加上这句,防止数组引用时 溢出
if (x[i] > x[i + 1])
{
int 临时存储 = x[i];
x[i] = x[i + 1];
x[i + 1] = 临时存储;
}
}
//输出数组中每个值 看看效果
for (int i=0;i<10;i++)
{
std::cout << x[i] << " ";
}
std::cout<<std::endl;
return 0;
}
2,重复第一个步骤
#include<iostream>
int main()
{//示例 从小到大排序
int x[10] = { 3,4,45,5,43,23,24,2543,25,342 };
for (int j = 0;j < 10;j++)//步骤2
{
for (int i = 0;i < 10;i++)//步骤1
{
if (i == 9)break;//最后一个值 没有i+1 加上这句,防止数组引用时 溢出
if (x[i] > x[i + 1])
{
int 临时存储 = x[i];
x[i] = x[i + 1];
x[i + 1] = 临时存储;
}
}
}
//输出数组中每个值 看看效果
for (int i=0;i<10;i++)
{
std::cout << x[i] << " ";
}
std::cout<<std::endl;
return 0;
}
用类来实现
#include<iostream>
class A
{
public:
int x[10];
A()//构造函数里 初始化数组中的值
{
x[0] = 3,x[1] = 4,x[2] = 45,x[3] = 5,x[4] = 43, x[5] = 23,x[6] = 24,x[7] = 2543,x[8] = 25,x[9] = 342;
}
void 输出()
{
for (int i = 0;i < 10;i++)
std::cout << x[i] << " ";
std::cout << std::endl;
}
void 交换(int 位置a, int 位置b)
{
int c= x[位置a];
x[位置a] = x[位置b];
x[位置b] = c;
}
void 把最大值往右移(int 结束位置)
{
for (int i = 0; i < 结束位置;i++)
{
//if (i == 结束位置)break;//最后一个值 没有i+1 加上这句,防止数组引用时 溢出
if (x[i] > x[i + 1])
{
交换(i, i + 1);
}
}
}
void 开始冒泡排序()//这里演示 从大到小排序
{
for (int i = 9; i>=0;i--)
{
把最大值往右移(9);
输出();//展示一下 每次移到后的 数组
}
}
};
int main()
{
A a;
std::cout << " 开始前 \n";
a.输出();//排序前 输出一下 看看效果
std::cout << " 排序中 \n";
a.开始冒泡排序();
std::cout << " 完成 \n";
a.输出();//排序后 输出一下 看看效果
return 0;
}
优化一下,减少计算次数,先看代码,(代码 下面有解析)
#include<iostream>
class A
{
public:
int x[10];
A()//构造函数里 初始化数组中的值
{
x[0] = 3, x[1] = 4, x[2] = 45, x[3] = 5, x[4] = 43, x[5] = 23, x[6] = 24, x[7] = 2543, x[8] = 25, x[9] = 342;
}
void 输出()
{
for (int i = 0;i < 10;i++)
std::cout << x[i] << " ";
std::cout << std::endl;
}
void 交换(int 位置a, int 位置b)
{
int c = x[位置a];
x[位置a] = x[位置b];
x[位置b] = c;
}
bool 把最大值往右移(int 结束位置)
{
bool 交换位置 = false;
for (int i = 0; i < 结束位置;i++)
{
//if (i == 结束位置)break;//最后一个值 没有i+1 加上这句,防止数组引用时 溢出
if (x[i] > x[i + 1])
{
交换(i, i + 1);
交换位置 = true;
}
}
return 交换位置;
}
void 开始冒泡排序()//这里演示 从大到小排序
{
bool 交换位置 = true;
for (int i = 9; i >= 0;i--)
{
if (!把最大值往右移(9))break;
输出();//展示一下 每次移到后的 数组
}
}
};
int main()
{
A a;
std::cout << " 开始前 \n";
a.输出();//排序前 输出一下 看看效果
std::cout << " 排序中 \n";
a.开始冒泡排序();
std::cout << " 完成 \n";
a.输出();//排序后 输出一下 看看效果
return 0;
}
解析:
之前的代码 也优化一下:
#include<iostream>
int main()
{//示例 从小到大排序
int x[10] = { 3,4,45,5,43,23,24,2543,25,342 };
for (int j = 9;j>=0;j--)//步骤2
{
bool 移动 = false;
for (int i = 0;i < j;i++)//步骤1
{
if (x[i] > x[i + 1])
{
int 临时存储 = x[i];
x[i] = x[i + 1];
x[i + 1] = 临时存储;
移动 = true;
}
}
if (!移动)break;
}
//输出数组中每个值 看看效果
for (int i = 0;i < 10;i++)
{
std::cout << x[i] << " ";
}
std::cout << std::endl;
return 0;
}