以从小到大排序为例:
冒泡排序步骤:
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;
}