zoukankan      html  css  js  c++  java
  • 冒泡排序

    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] + "
    ");
    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)。

  • 相关阅读:
    【[Offer收割]编程练习赛12 B】一面砖墙
    【[Offer收割]编程练习赛12 A】歌德巴赫猜想
    【codeforces 779E】Bitwise Formula
    Java Web整合开发(85)
    数字
    T2602 最短路径问题 codevs
    P3378 堆【模板】 洛谷
    T1013 求先序排列 codevs
    P1717 钓鱼 洛谷
    P2085 最小函数值 洛谷
  • 原文地址:https://www.cnblogs.com/lxGIS/p/4304860.html
Copyright © 2011-2022 走看看