2 lichjx lichjx 于 2016.09.19 17:09 提问

一个测试排序效率的小程序出现的现象,求解释

今天写了个小程序测试一些排序的效率玩,却发现计时器出现了个奇怪的现象,在取测试结果的时候
,如果测试的数组小,一切正常,每个排序的时间都能打印出来,但如果第二个数组很大,比如10万,第一个数组小,比如10,
则第一个打印结果的时间竟然变成了0ms,第二个排序的打印结果是正常的。
下面放代码:

这是事发地点:

 string[] res;
            //选择排序
            res = SortComponent<int>.selectionSortSimple(getBefroeSortArr());
            printEndInfo("selectionSortSimple:", res);
            //插入排序
            /*这行会出问题,第一组选择排序的执行时间变成了0 */
            //res = SortComponent<int>.insertSortSimple(getBefroeSortArr2(50000)); 
            /*这样取结果就没问题,选择排序的执行时间会打印出来*/
            string[] res1 = SortComponent<int>.insertSortSimple(getBefroeSortArr2(50000));
            printEndInfo("insertSortSimple:", res1);
            Console.ReadKey();

这是计时的类:

 class GCTiming
    {
        TimeSpan duration;
        public GCTiming()
        {
            duration = new TimeSpan(0);
        }
        public void StopTime()
        {
            duration = Process.GetCurrentProcess().TotalProcessorTime;
        }
        public void StartTime()
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
        public TimeSpan Result()
        {
            return duration;
        }
    }

下面放上完整的程序:
progream.cs

  static void Main(string[] args)
        {
            printStartInfo();
            string[] res;
            //选择排序
            res = SortComponent<int>.selectionSortSimple(getBefroeSortArr());
            printEndInfo("selectionSortSimple:", res);
            //插入排序
            /*这行会出问题,第一组选择排序的执行时间变成了0 */
            //res = SortComponent<int>.insertSortSimple(getBefroeSortArr2(50000)); 
            /*这样取结果就没问题,选择排序的执行时间会打印出来*/
            string[] res1 = SortComponent<int>.insertSortSimple(getBefroeSortArr2(50000));
            printEndInfo("insertSortSimple:", res1);
            Console.ReadKey();
        }

        static void PrintArray(string[] array)
        {
           Console.WriteLine(SortUtil<string>.intArrToString(array));
        }

        static void printStartInfo()
        {
            Console.WriteLine("before sort:");
            PrintArray(Array.ConvertAll<int, string>(getBefroeSortArr(), s => s.ToString()));
        }

        static void printEndInfo(string name,string[] sortRes)
        {
            Console.WriteLine("after {0} sort:\r\n{2}\r\ntotal time is :{1}ms\r\n\r\n",name,sortRes[0],sortRes[1]);
        }

        static int[] getBefroeSortArr() {
            return new int[] { 2, 9, 2, 1, 8, 2, 3, 5, 19, 29, 13, 11, 45 };
        }

        static int[] getBefroeSortArr2(int length=100)
        {
            int[] arr = new int[length];
            Random rn = new Random();
            for (int i = 0; i < length; i++)
            {
                arr[i] = rn.Next(1, length);
            }
            return arr;
        }

排序类:

 /// <summary>
    /// 选择排序
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class SortComponent<T> where T : IComparable<T>
    {

        public static string[] selectionSortSimple(T[] array)
        {
            int n = array.Length;
            GCTiming tiObj = new GCTiming();
            //Thread.Sleep(1000);
            tiObj.StartTime();
            Console.WriteLine("选择排序(selectionSort)开始:");
            for (int i = 0; i < n; i++)
            {
                int min = i;
                for (int j = i + 1; j < n; j++)
                {
                    if (array[min].CompareTo(array[j]) > 0)
                    {
                        min = j;
                    }
                }

                SortUtil<T>.swap(array, i, min);
            }
            tiObj.StopTime();
            return new string[] { tiObj.Result().TotalMilliseconds.ToString(), SortUtil<T>.intArrToString(array) };
        }

        public static string[] insertSortSimple(T[] array)
        {
            int n = array.Length;
            GCTiming tiOb = new GCTiming();
            tiOb.StartTime();
            Console.WriteLine("插入排序(insertionSort)开始:");
            //默认第一个元素排好序了,所以从第二个开始往排好序的方向比较
            for (int i = 1; i < n; i++)
            {
                //与排好序的方向比较,如果小于前面的就交换后继续比,直到相等或大于后,从刚才的i下标继续往n的方向取元素排序
                for (int j = i; j > 0; j--)
                {
                    if (array[j].CompareTo(array[j - 1]) < 0)
                    {
                        SortUtil<T>.swap(array, j, j - 1);
                    }
                    else//如果下标i指针项大于比较项,则无需再向排好序的方向继续比较,因为前面的都是排好序的
                    {
                        break;
                    }
                }
            }
            tiOb.StopTime();
            return new string[] { tiOb.Result().TotalMilliseconds.ToString(), SortUtil<T>.intArrToString(array) };
        } 


    }
 class SortUtil<T> 
    {
        public static void swap(T[] array, int i, int min)
        {
            T temp = array[i];
            array[i] = array[min];
            array[min] = temp;
        }

        void swap7(int x, int y)
        {
            if (x == y)
                return;
            y = x + y - (x = y);
        }

        public static string intArrToString(T[] array)
        {
           return string.Join(",", Array.ConvertAll<T, string>(array, s => s.ToString()));
        }
    }

1个回答

caozhy
caozhy   Ds   Rxr 2016.09.19 23:06

10个数字的排序,结果是0,很正常,因为取得的时间精度没有那么高,10个数字的排序是纳秒级别的,测量不出来。

lichjx
lichjx 是可以测出的,平均65ms
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
八大排序算法-及运行时间测试
不管是提高自身的能力,还是面试,八大排序都是很重要的一个知识点,所以理解并实践实现是很有必要的,以下给出算法思想与代码实现,并且进行运行时间测试八大排序的效率。
编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。
#include"iostream" #include"algorithm" #include"string.h" using namespace std; template class Array { private: int length; ElemType *a; public: Array(){ cout << "元素个数为:" << endl ; cin >>
HDU2020 绝对值排序【入门】
绝对值排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 90298    Accepted Submission(s): 42643 Problem Description 输入n(n   Input 输
JAVA作业 算法测试:编写算法测试小软件
题目: 算法测试:编写算数测试小软件,三个类组成,Teacher类负责出题,并判断回答是否正确;ComputerFrame类负责提供视图,用户可通过此类GUI看到题目,并编写答案;MainClass是软件入口类。 思想:如题目要求,简单实现就可以了。 源代码: MainClass.java package countTest; import javax.swing.JFrame;
HDU 六度分离(Floyd)
A - 六度分离 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 1967年,美国著名的社会学家斯坦利・米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任
排序问题 二
这篇文章,我将主要与大家一起探讨排序中的冒泡排序,快排,并且会给出不同的例题,希望会对大家对排序有进一步的了解。下面我们话不多说,进入正题一.冒泡排序法先思考一下什么叫做冒泡排序?1.定义: 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,
对数组进行排序、求最大值和求元素和的算法都编写为函数模板,采用相关数据进行测试
#include using namespace std; template void sort(T * a,int n){ for(int i=0;i<n;i++){ int p=i; for(int j=i;j<n;j++) if(a[p]<a[j]) p=j; int t=a[i]; a[i]=a[p]; a[p]=t; } } template void display
C++第六周mooc在线测评—问题的模块化求解(2)——特殊函数
//编写递归函数求数组最大值(20分) //题目内容: //编写函数求一个数组中数组元素的最大值,要求必须用递归方法解决。 // //输入格式 ://编写内联函数求矩形的面积和周长(20分) //题目内容: //编写函数求矩形的面积和周长,由于算式非常简单,请使用内联函数方式编写,提高程序运行效率 // //输入格式 : //矩形的长和宽,均为整数 // //输出格式: //矩形的面积和周长 //
我的第一个Qt程序:使用Qt creator和Qt designer完成"HelloWorld"和计算圆面积的程序设计
编译环境如下: iMac操作系统Mac OS X Lion 10.7.4(11E53) Qt Creator 版本2.5.2 但与window下完全相同; 首先介绍HelloQt实验,我们想用代码,让Qt弹出一个按钮(Button),Button上写着“HelloQt”点击之后程序结束。 第一步:          ctrl(commend)+N新建工程  其他项目---空
HDU-2020(绝对值排序)(abs函数)
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。