排序(冒泡)

之前刚写完插入排序接下来写写冒泡排序

冒泡排序就像水泡一样不断的上浮,从而达到排序的目的。冒泡排序和插入排序一样也是分成也排序部分和未排序部分。

就是一个重复执行以下步骤的一个过程:

从数组的末尾取一个元素开始依次的向前比较相邻的两个元素,如果大小关系相反则交换位置。

举个例子:

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     }  

 

posted @ 2016-12-21 11:32  fengsz  阅读(142)  评论(0编辑  收藏  举报