算法是如何影响程序编码方式的 - 基本排序算法
2018-06-23 22:05:46来源:未知 阅读 ()
我们的目标是从一个int的Array中,找出最小值。
作为demo程序,我们先增加一个类,用来模拟Array,如下定义:
class CArray { const int DefaultCapacity = 100; private int[] array; private int curPosition = -1; public CArray() { this.array=new int[DefaultCapacity]; curPosition = -1; } public CArray(int capacity) { this.array = new int[capacity]; curPosition = -1; } public void Insert(int value) { if (curPosition + 1 >= array.Length) throw new Exception("数组已经达到最大长度,无法再插入了。"); curPosition++; array[curPosition] = value; } public void Clear() { curPosition = -1; this.array=new int[this.array.Length]; } public void Display() { Console.WriteLine(); for (var i = 0; i < this.curPosition; i++) Console.Write(string.Format("{0}, ", this.array[i])); } #region 统计函数 public int Max() { int maxValue=this.array[0]; for (var i = 1; i <= this.curPosition; i++) if (maxValue < this.array[i]) maxValue = this.array[i]; return maxValue; } public int Min() { int minValue = this.array[0]; for (var i = 1; i <= this.curPosition; i++) if (minValue > this.array[i]) minValue = this.array[i]; return minValue; } #endregion
再加入一个计算所用时间的类,用来计算Min/Max函数所运行的时间
class Timing { Stopwatch tm = new Stopwatch(); public void Start() { GC.Collect(); GC.WaitForPendingFinalizers(); tm.Reset(); tm.Start(); } public void Stop() { tm.Stop(); } public void Display(string msg) { Console.WriteLine(msg + ", 共花费了 " + tm.Elapsed.TotalMilliseconds + " 毫秒"); } }
我们先来写个最简单的,没有排序功能的demo程序,来看看当没有排序时的性能:
int count = 19999; CArray aryObj = new CArray(count); Random rnd = new Random(DateTime.Now.Second); for (var i = 0; i < count; i++) aryObj.Insert((int)(rnd.NextDouble() * 100000) + 1); Timing t = new Timing(); t.Start(); aryObj.Min(); t.Stop(); t.Display("排序前Min值");
运行结果:
然后,我们再为这个CArray编写一个排序功能,如下:
public void BubbleSort() { int temp; for (var i = this.curPosition; i >= 1; i--) { for (var j = 0; j <= i-1; j++) { if (this.array[j] > this.array[i]) { temp=this.array[i]; this.array[i] = this.array[j]; this.array[j]=temp; } } } sorted = true;//新增加的一个私有成员 } public int Min()//修改 { if (sorted) return this.array[0]; int minValue = this.array[0]; for (var i = 1; i <= this.curPosition; i++) if (minValue > this.array[i]) minValue = this.array[i]; return minValue; }
然后修改主程序如下
int count = 19999; CArray aryObj = new CArray(count); Random rnd = new Random(DateTime.Now.Second); for (var i = 0; i < count; i++) aryObj.Insert((int)(rnd.NextDouble() * 100000) + 1); Timing t = new Timing(); t.Start(); aryObj.Min(); t.Stop(); t.Display("排序前Min值"); t.Start(); aryObj.BubbleSort(); t.Stop(); t.Display("冒泡排序"); t.Start(); aryObj.Min(); t.Stop(); t.Display("排序后Min值");
运行结果图:
Min函数的执行效率在排序前后相差了379倍。
其实到这里大家都懂了,但是又出现了另外一个话题:排序函数怎么花了这么长时间?
- 这就牵涉到各种排序算法的比较了,以后再讲。
有人肯定会说,这些排序算法在C#中都已经被ms实现了,所以没用!
- 对,是被实现了,但本篇是讲现实项目中,算法是如何影响程序的
- ms实现的是一些常用算法,要是遇到了非常用,非标准的算法才能解决的问题呢?比如各种算法的变种,你不会要等ms出一个更新才用吧
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:HTTP协议的8种请求类型介绍
- 如果是自学WEB前端的话,该如何才能找到一份7K实习生工作呢 2020-06-04
- 前端如何学习? 2020-06-04
- 如何成为一名优秀的web前端工程师 2020-06-02
- 零基础小白转行如何入门学习web前端 2020-06-01
- 如何在博客园添加自己的头像 2020-05-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash