之前刚写完插入排序接下来写写冒泡排序
冒泡排序就像水泡一样不断的上浮,从而达到排序的目的。冒泡排序和插入排序一样也是分成也排序部分和未排序部分。
就是一个重复执行以下步骤的一个过程:
从数组的末尾取一个元素开始依次的向前比较相邻的两个元素,如果大小关系相反则交换位置。
举个例子:
A = {5,3,2,4,1};
1.{5,3,2,4<=>1}; 5.{1|,5,3,2<=>4}; 8.{1,2|,5,3,4}; 10.{1,2,3,5<=>4};
2.{5,3,2<=>1,4}; 6.{1|,5,3<=>2,4}; 9.{1,2|,5<=>3,4};A = {1,2,3,4,5};
3.{5,3<=>1,2,4}; 7.{1|,5<=>2,3,4}; A = {1,2,3|,5,4};________|
4.{5<=>1,3,2,4}; A = {1,2|,5,3,4};_________|
A = {1|,5,3,2,4};__________|
就这样就完成了排序。
复杂度分析:
假设排序的数量为N;
而冒泡排序对未排序部分的操作为(N-1)+(N-2)+……+1 = (N^2-N)/2
则算法复杂度的数量级为O(N^2);
优缺点:
时间复杂度相对较大,但冒泡排序具有很好的稳定性。
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 100 + 5;
int n;
int a[maxn];
int bubble_sort(int l,int r){
int ans = 0;
for(int i = l;i <= r; i++){
for(int j = r;j >= i+1; j--){
if(a[j-1] > a[j]){
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
ans++;
}
}
}
return ans;
}
void print(int l,int r){
bool flag = false;
for(int i = 1;i <=n; i++){
if(flag)printf(" ");
printf("%d",a[i]);
flag = true;
}
}
int main(){
scanf("%d",&n);
for(int i = 1;i <= n; i++)scanf("%d",&a[i]);
int ans = bubble_sort(1,n);
print(1,n);
printf("\n%d\n",ans);
}