算法分析:
时间复杂度:O(n²)
空间复杂度:O(1)
算法特点:
稳定排序
可用于链式存储结构
移动记录次数较多,算法的平均时间性能比直接插入排序的差。当初始记录无序、n较大时,此算法不宜使用
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 10010; //定义数组最大长度
void Bubble_sort(int arr[], int n); //声明冒泡排序函数
void Swap(int *a, int *b); //声明值交换函数
int main()
{
int n; cin >> n; //输入要排序的数组长度
int arr[N]; //定义数组
for(int i = 0; i < n; i++) cin >> arr[i]; //输入n个数
Bubble_sort(arr, n); //进行冒泡排序
for(int i = 0; i < n; i++) cout << arr[i] << " "; //输出排序结果
return 0;
}
//定义冒泡排序函数,参数为数组arr[],数组长度n
void Bubble_sort(int arr[], int n)
{
bool flag = true; //定义排序结束标志flag
for(int i = n-1; i > 0 && flag; i--) //外层循环,冒泡排序是从后往前确定的
{
flag = false; //每次排序时将flag重置为false,若flag值不改变,说明排序已完成
for(int j = 1; j <= i; j++) //内层循环从前往后两两比较,将较大值后移
{
if(arr[j] < arr[j-1]) //当后一个数小于前一个数则调换两个数的位置
{
Swap(&arr[j-1], &arr[j]); //将两个值进行交换
flag = true; //一旦发证值交换则说明数组排序尚未结束,将flag改为true进入下一次循环
}
}
}
}
//定义值交换函数
void Swap(int *a, int *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
/*
冒泡排序是从前往后比较,从后往前确定的一种算法
从前往后两两比较,找到其中较大值进行后移
一轮排序结束后,会找到一个最大值放在数组的末尾
之后按照这个顺序能找到第二大的值放在数组倒数第二的位置
以此类推
flag的意义是在一些情况小下,可能循环为遍历完就排序完成了
此时我们不需要进行接下来的比较了,可以直接跳出循环宣布排序完成
*/
欢迎大家探讨