在c++中,冒泡排序是一种很经典的排序方法。
冒泡排序的思路
在冒泡排序中,所有待排序的数都像一个个气泡在水中,大的会浮上去,小的会沉下来,就像数组的排序。
冒泡排序会让被选中的数与它右边的数比较,然后交换,重复下去,直到一轮排序结束。
示意图
如图,第一轮时,6>5,所以交换,然后6>3,交换,6>4,交换,6>1,交换,6>2,交换,第一轮结束。
第二轮时,5>3,交换,5>4,交换,5>1,交换,5>2,交换,第二轮结束。
第三轮,3<4,所以不交换,因为不交换,所以让下一个继续比较,...... ,以此类推。
最终得到有序数组,即123456。
代码
从小到大(升序)
#include <bits/stdc++.h>//万能头
using namespace std;
int main (){
int n;//有多少个数
cin >> n;
int a[n] = {};//数组
for (int i = 0; i < n; ++i){
cin >> a[i];//输入待排序的数组
}
for (int i = 0; i < n - 1; ++i){//双重循环遍历
for (int j = 0; j < n - 1 - i; ++j){
//n - 1 是因为 后面有j + 1
//- i 是因为 每次j循环结束,后面就会多一个有序的数字
if (a[j] > a[j + 1]){//如果a[j]>a[j + 1],就要交换
swap(a[j], a[j + 1]);//交换swap
}
}
}
for (int i = 0; i < n; ++i){
cout << a[i] << ' ';//循环输出
}
return 0;//结束
}
从大到小(降序)
#include <bits/stdc++.h>//万能头
using namespace std;
int main (){
int n;//有多少个数
cin >> n;
int a[n] = {};//数组
for (int i = 0; i < n; ++i){
cin >> a[i];//输入待排序的数组
}
for (int i = 0; i < n - 1; ++i){//双重循环遍历
for (int j = 0; j < n - 1 - i; ++j){
//n - 1 是因为 后面有j + 1
//- i 是因为 每次j循环结束,后面就会多一个有序的数字
if (a[j] < a[j + 1]){//如果a[j]<a[j + 1],就要交换
swap(a[j], a[j + 1]);//交换swap
}
}
}
for (int i = 0; i < n; ++i){
cout << a[i] << ' ';//循环输出
}
return 0;//结束
}
优化
示意图
我们来看这个:
这时,第一次排序结束后,数组已经是一个有序数组了,但后面还在循环,如果数据量大,会很浪费计算机的计算量。
优化
我们可以定义一个bool变量。
每次j循环开始前将它赋值为true,
一旦交换就赋值为false。
最后检查它是不是true,
如果是,说明没有交换
没有交换,说明这个数组已经是有序的了。
优化后的代码
从小到大(升序)
#include <bits/stdc++.h>//万能头
using namespace std;
int main (){
int n;//有多少个数
cin >> n;
int a[n] = {};//数组
bool flag;
for (int i = 0; i < n; ++i){
cin >> a[i];//输入待排序的数组
}
for (int i = 0; i < n - 1; ++i){//双重循环遍历
flag = true;
for (int j = 0; j < n - 1 - i; ++j){
//n - 1 是因为 后面有j + 1
//- i 是因为 每次j循环结束,后面就会多一个有序的数字
if (a[j] > a[j + 1]){//如果a[j]>a[j + 1],就要交换
swap(a[j], a[j + 1]);//交换swap
flag = false;
}
}
if(flag == true){
break;
}
}
for (int i = 0; i < n; ++i){
cout << a[i] << ' ';//循环输出
}
return 0;//结束
}
从大到小(降序)
#include <bits/stdc++.h>//万能头
using namespace std;
int main (){
int n;//有多少个数
cin >> n;
int a[n] = {};//数组
bool flag;
for (int i = 0; i < n; ++i){
cin >> a[i];//输入待排序的数组
}
for (int i = 0; i < n - 1; ++i){//双重循环遍历
flag = true;
for (int j = 0; j < n - 1 - i; ++j){
//n - 1 是因为 后面有j + 1
//- i 是因为 每次j循环结束,后面就会多一个有序的数字
if (a[j] < a[j + 1]){//如果a[j]<a[j + 1],就要交换
swap(a[j], a[j + 1]);//交换swap
flag = false;
}
}
if(flag == true){
break;
}
}
for (int i = 0; i < n; ++i){
cout << a[i] << ' ';//循环输出
}
return 0;//结束
}
tips:
从大到小(降序)和从小到大(升序)其实就一个符号的差别啦
完结撒花~
有意见和问题请在评论区提出,谢谢!!!