Web Page Counter
Internet Date

冒泡排序

1:原理

以此比较相邻的两个元素,每次比较完毕最大的一个字跑到本轮的末尾。 
目的:按从小到大排序。 
方法: 
假设存在数组:72, 54, 59, 30, 31, 78, 2, 77, 82, 72 
第一轮比较相邻两个元素,如果左边元素大于右边元素,则交换。 
72和54比较的结果就是,54在前,72在后; 
然后72和59比较的结果,59在前,72在后; 
以此类推,第一轮比较之后的结果是:54, 59, 30, 31, 72, 2, 77, 78, 72, 82 
经过第一轮比较,最大的元素跑到了最后一个,所以第二轮比较,最后一个元素不需要进行比较了。  
第二轮还是从索引0和1开始比较,只是不许要比较最后一个了,算法还是一样的。第三轮、第四轮以此类推。 

 1     class Program
 2     {
 3         /// <summary>
 4         /// 冒泡排序(从小到大)
 5         /// </summary>
 6         /// <param name="a"></param>
 7         /// <returns></returns>
 8         public static int[] bubble(int[] a)
 9         {
10             //临时变量
11             int temp = 0;
12             //第一层循环i是比较的轮数,也是两数比较的次数
13             for (int i = a.Length - 1; i > 0;i--)
14             {
15                 //第二层循环每次j都从1开始
16                 for (int j = 1; j <= i;j++)
17                 {
18                     //前数大于后数
19                     if (a[j-1]>a[j])
20                     {
21                         //将前数的值赋予临时变量
22                         temp = a[j - 1];
23                         //把后数的值赋给前数
24                         a[j - 1] = a[j];
25                         //把临时变量存储的前数值赋给后数
26                         a[j] = temp;
27                     }
28                 }
29             }
30             return a;
31         }
32 
33         static void Main(string[] args)
34         {
35             int[] a = new int[] { 72, 54, 59, 30, 31, 78, 2, 77, 82, 72 };
36             int[] b=bubble(a);
37             for (int i = 0; i < b.Length;i++)
38             {
39                 Console.WriteLine(b[i] + "\n");
40             }
41             Console.Read();
42         }
43     }

2.冒泡排序时间复杂度: 

    冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算。举个例子来说,一个数列 5 4 3 2 1 进行冒泡升序排列,第一次大循环从第一个数(5)开始到倒数第二个数(2)结束,比较过程:先比较5和4,4比5小,交换位置变成4 5 3 2 1;比较5和3,3比5小,交换位置变成4 3 5 2 1……最后比较5和1,1比5小,交换位置变成4 3 2 1 5。这时候共进行了4次比较交换运算,最后1个数变成了数列最大数。
第二次大循环从第一个数(4)开始到倒数第三个数(2)结束。进行3次比较交换运算。
……
所以总的比较次数为 4 + 3 + 2 + 1 = 10次
对于n位的数列则有比较次数为 (n-1) + (n-2) + ... + 1 = n * (n - 1) / 2,这就得到了最大的比较次数
而O(N^2)表示的是复杂度的数量级。举个例子来说,如果n = 10000,那么 n(n-1)/2 = (n^2 - n) / 2 = (100000000 - 10000) / 2,相对10^8来说,10000小的可以忽略不计了,所以总计算次数约为0.5 * N^2。用O(N^2)就表示了其数量级(忽略前面系数0.5)。

posted @ 2015-02-28 10:28  LX一木  阅读(287)  评论(0编辑  收藏  举报