博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#之冒泡排序的三种实现和性能分析
阅读量:5150 次
发布时间:2019-06-13

本文共 3284 字,大约阅读时间需要 10 分钟。

     冒泡排序算法是我们经常见到的尤其是子一些笔试题中.

     下面和大家讨论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 /// 10         /// 冒泡排序,传统数据交换实现11         /// 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   ///  2         /// linq 冒泡排序算法 3         ///  4         static void BubblingTwo() 5         {     6             IEnumerable
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>

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

 

 

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

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

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

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

 

///         /// 使用Linq的扩展方法OrderByDescending        ///         static void BubblingThree()        {            IEnumerable
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#下的三种冒泡排序方法以及性能分析.由于数据量较小得出结论难免没有说服力,有兴趣的朋友可已多加数据至数万条。

如果对你有帮助,请帮忙推荐一下.

转载于:https://www.cnblogs.com/wolferfeng/p/3824086.html

你可能感兴趣的文章
【Java】使用Eclipse进行远程调试,Linux下开启远程调试
查看>>
js对象属性方法
查看>>
转:JUnit使用指南
查看>>
C++面试题整理(持续更新中)
查看>>
vs2017 git到oschina 方法
查看>>
对Vue为什么不支持IE8的解释之一
查看>>
使用easyUI 为datagrid冻结列
查看>>
开发 web 桌面类程序几个必须关注的细节
查看>>
bzoj 2784: [JLOI2012]时间流逝【树形期望dp】
查看>>
Myeclipse10.7添加本地插件方法
查看>>
Swift - 将字符串拆分成数组(把一个字符串分割成字符串数组)
查看>>
NSRange,判断字符串的各种操作~
查看>>
Java基本数据类型之间赋值与运算归纳
查看>>
Facebook开源软件列表
查看>>
Swift版音乐播放器(简化版),swift音乐播放器
查看>>
iOS中AutoLayer自动布局流程及相关方法
查看>>
使用Git工具下载android源码---带步骤
查看>>
内容版本SecureCRT脚本
查看>>
宋体光标vim高亮显示当前行,列
查看>>
Java集合---ConcurrentHashMap原理分析
查看>>