排序(冒泡)
之前刚写完插入排序接下来写写冒泡排序
冒泡排序就像水泡一样不断的上浮,从而达到排序的目的。冒泡排序和插入排序一样也是分成也排序部分和未排序部分。
就是一个重复执行以下步骤的一个过程:
从数组的末尾取一个元素开始依次的向前比较相邻的两个元素,如果大小关系相反则交换位置。
举个例子:
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);
优缺点:
时间复杂度相对较大,但冒泡排序具有很好的稳定性。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 const int maxn = 100 + 5; 6 7 int n; 8 int a[maxn]; 9 10 int bubble_sort(int l,int r){ 11 int ans = 0; 12 for(int i = l;i <= r; i++){ 13 for(int j = r;j >= i+1; j--){ 14 if(a[j-1] > a[j]){ 15 int temp = a[j-1]; 16 a[j-1] = a[j]; 17 a[j] = temp; 18 ans++; 19 } 20 } 21 } 22 return ans; 23 } 24 25 void print(int l,int r){ 26 bool flag = false; 27 for(int i = 1;i <=n; i++){ 28 if(flag)printf(" "); 29 printf("%d",a[i]); 30 flag = true; 31 } 32 } 33 34 int main(){ 35 scanf("%d",&n); 36 for(int i = 1;i <= n; i++)scanf("%d",&a[i]); 37 int ans = bubble_sort(1,n); 38 print(1,n); 39 printf("\n%d\n",ans); 40 }