频道栏目
首页 > 程序开发 > 软件开发 > C# > 正文
c#之冒泡排序的三种实现和性能分析
2014-07-05 08:24:26           
收藏   我要投稿
冒泡排序算法是我们经常见到的尤其是子一些笔试题中.

 

     下面和大家讨论c#中的冒泡排序,笔者提供了三种解决方案,并且会分析各自的性能优劣.

 

    第一种估计大家都掌握的,使用数据交换来实现,这种就不多说了,园子里的各位前辈分析的都很好,搜一下就有很多.

 

    简单贴一下代码:

 

     

 

复制代码

 1  //定义数组

 2  static int[] nums = new int[] { 100, 99, 45, 56, 67, 78, 98, 8, 7, 65, 55, 43, 32, 23, 35, 36, 38, 37, 120, 150, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 30, 32, 31, 29, 28, 26, 27, 25, 22, 24 };

 3         static void Main(string[] args)

 4         {

 5             Console.WriteLine("冒泡排序之传统方法");

 6             BubblingOne();

 7             Console.ReadKey();

 8         }

 9 /// <summary>

10         /// 冒泡排序,传统数据交换实现

11         /// </summary>

12         static void BubblingOne()

13         {

14             //定义一个需要排序的数组

15 

16             //定义一个临时变量用于数据交换

17             int temp; //临时变量,保存最大值

18             int i, j; //循环变量

19             for (i = 0; i < nums.Length - 1; i++)

20             {

21                 for (j = 0; j < nums.Length - 1 - i; j++)

22                 {

23                     if (nums[j] < nums[j + 1])

24                     {

25                         temp = nums[j];

26                         nums[j] = nums[j + 1];

27                         nums[j + 1] = temp;

28                     }

29                 }

30             }

31             foreach (int c in nums) //用foreach输出排序后的数组元素 

32             {

33                 Console.Write(c + "\t");

34             }

35         }

复制代码

运行结果如下:

 

  

 

接下来我们介绍第二种实现方法:Linq的查询表达式语法的实现.

 

 

 

  关于Linq的介绍请参见:

 

 

 

 

 

复制代码

 1   /// <summary>

 2         /// linq 冒泡排序算法

 3         /// </summary>

 4         static void BubblingTwo()

 5         {    

 6             IEnumerable<int> num = from a in nums orderby a descending select a;

 7             foreach (int item in num)

 8             {

 9                 Console.Write(item + "\t");

10             }   

11         }

复制代码

 

 

请注意我们实现了泛型接口IEnumerable<T>

 

IEnumerable<T> 是一个接口,通过该接口,可以使用 foreach 语句来枚举泛型集合类。 泛型集合类支持 IEnumerable<T>,就像非泛型集合类(如ArrayList)支持 IEnumerable。

 

 

 

 

 

运行结果和第一种方法一致.

 

 你可能已经发现了,代码简洁了许多,有原来的8行缩短为一行,这不正是我们的追求吗?尤其是在面试的时候是否为你节约了大量的时间?

 

那是否还有其他的方式继续实现冒泡排序呢?答案是肯定的,记住我们是对数组中的数据进行操作,Linq有两个扩展方法OrderByDescending和OrderBy用于对数据排序,请参见:对数据进行排序

 

第三种实现:使用Linq 的扩展方法OrderByDescending(倒序排列)和OrderBy(正序排列)

 

 

 

复制代码

  /// <summary>

        /// 使用Linq的扩展方法OrderByDescending

        /// </summary>

        static void BubblingThree()

        {

            IEnumerable<int> num = nums.OrderByDescending(a => a);

            foreach (int item in num)

            {

                Console.Write(item + "\t");

            }

        }

复制代码

代码一如既往的简洁.请注意该方式实现了IEnumerable<T>接口.

 

 也许还有更多的实现方式,但本文只介绍这三种方法.

 

 既然有这么多实现方法,我们应该怎么选择用哪种呢,笔者在这里做了一个简单的性能对比(比较各自的执行时间).

 

首先我们更新以上代码,加入时间的计算:

 

  

 

 在为三种方法加入了上图红色区域代码后,我们比较一下不同数据量三种方法各自的表现

 

 插入5条数据

 

       //5条数据

        static int[] nums = new int[] { 10, 99, 45, 56, 67 };

 结果如下:

 

 

 

 从上图我们可以简单得出结论,在小数据量是Linq的查询表达式语法表现最差,使用OrderByDescending方法最佳.

 

 下面我们多加几条数据.

 

  //15条数据

        static int[] nums = new int[] { 100, 99, 45, 56, 67, 78, 98, 8, 7, 65, 55, 43, 38, 37, 120 };

结果如下:

 

  

 

结果还是OrderByDescending方法领先

 

 

 

我们继续加入数据: 

 

   //50条数据

        static int[] nums = new int[] { 101, 991, 451, 561, 100, 99, 45, 56, 67, 78, 98, 8, 7, 65, 55, 43, 32, 23, 35, 36, 38, 37, 120, 150, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 30, 32, 31, 29, 28, 26, 27, 25, 22, 24 };

       

结果如下:

 

 

 

从上图中我们可以看到情况发生了变化,第一种方法领先,然而在我们的测试中丝毫没有看到Linq查询表达式语法(感谢@WAKU的批评)的优势,但对于Linq中的扩展方法OrderByDescing()却有不俗的表现;

 

以上介绍了在C#下的三种冒泡排序方法以及性能分析.由于数据量较小得出结论难免没有说服力,有兴趣的朋友可已多加数据至数万条。

 

 

点击复制链接 与好友分享!回本站首页
相关TAG标签 性能分析
上一篇:C#用xpath查找某节点
下一篇:C#正则学习
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站