• 算法是如何影响程序编码方式的


    我们的目标是从一个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出一个更新才用吧
  • 相关阅读:
    C++ SOCKET 基础编程
    Linux 基础
    Python 基础
    H5禁止微信内置浏览器调整字体大小
    css中 出现height为100%失效的原因及解决方案
    CSS3 clip-path 用法介绍
    Web的26项基本概念和技术
    Web前端年后跳槽面试复习指南
    基于 HTML5 Canvas 的交互式地铁线路图
    常用长度单位PX/EM/PT/百分比转换公式与对照表
  • 原文地址:https://www.cnblogs.com/aarond/p/3448857.html
Copyright © 2020-2023  润新知