实例介绍
【实例简介】
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; namespace Sort_Test { public enum SortType { ///// <summary> ///// 快速排序 ///// </summary> //[Description("快速排序")] //Quick = 4, ///// <summary> ///// 随机快排 ///// </summary> //[Description("随机快排")] //RandomQuick = 5, /// <summary> /// 平衡快排 /// </summary> [Description("平衡快排")] BalanceQuick = 6, } class Program { // 数组集合 static long arrCount = 1; // 每个数组包含的元素个数 static long arrItemCount = 2000000; // 循环执行次数 static int loopCount = 1; // 顺序元素个数 默认:5%顺序率 static long orderNum = (long)(arrItemCount * 0.05); private static long minValue = Int32.MinValue; private static long maxValue = Int32.MaxValue; //private static long minValue = 0; //private static long maxValue = 99999; static bool isRandomAsc = true; static void Main(string[] args) { #region 随机生成测试用例,性能测试 功能测试 DoRandomArrAllTypeSort(ResultType.Error, isRandomAsc, 1, ShowResult); #endregion #region 随机生成 部分排序 测试用例,性能测试 功能测试 //orderNum = arrItemCount; DoRandomArrAllTypeSort(ResultType.Error, isRandomAsc, orderNum, ShowResult); #endregion Console.Read(); } /// <summary> /// 1、随机数组 /// 2、执行SortType枚举定义的所有排序算法 /// 3、性能计数 /// </summary> /// <param name="showType">显示结果类型</param> /// <param name="isAsc">升序元素</param> /// <param name="continueNum">连续元素个数</param> /// <param name="afterOneSort"></param> static void DoRandomArrAllTypeSort(ResultType showType, bool isAsc, long continueNum, Action<long[], ResultType> afterOneSort) { // 1、打印标题 ConsoleColor currentForeColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Green; if (continueNum <= 0) continueNum = 1; Console.WriteLine(continueNum == 1 ? "随机生成测试用例,性能测试 功能测试" : "随机生成 部分排序 测试用例,性能测试 功能测试"); Console.ForegroundColor = currentForeColor; // 2、生成随机数组 List<long[]> randomArrList = new List<long[]>(); for (long i = 1; i <= arrCount; i ) { randomArrList.Add(BuildRandomArr(arrItemCount, true, continueNum, minValue, maxValue)); } CodeTimer.Initialize(); // 3、调用每种排序方法,并进行性能计数 Array enumArr = Enum.GetValues(typeof(SortType)); foreach (var item in enumArr) { SortType curSortType = (SortType)item; try { CodeTimer.Time(curSortType.ToDescription(), loopCount , () => DoSort(randomArrList, curSortType, showType, afterOneSort) ); } catch (StackOverflowException ex) { Console.WriteLine(ex.Message.ToString()); } } } /// <summary> /// 执行指定排序算法 /// </summary> static void DoSort(List<long[]> arrList, SortType sortType , ResultType showType, Action<long[], ResultType> afterOneSort) { // 因为需要多次调用排序,所以不能对原排序数组进行改变,采用序列化方式进行深拷贝 MemoryStream ms = new MemoryStream(); BinaryFormatter binaryFormatter = new BinaryFormatter(); binaryFormatter.Serialize(ms, arrList); ms.Flush(); ms.Position = 0; List<long[]> cloneArrList = (List<long[]>)binaryFormatter.Deserialize(ms); foreach (var item in cloneArrList) { #region 执行排序 switch (sortType) { //case SortType.Quick: // Quick.Sort<long>(item, QuickType.Normal); // break; //case SortType.RandomQuick: // Quick.Sort<long>(item, QuickType.Random); // break; case SortType.BalanceQuick: Quick.Sort<long>(item, QuickType.Balance); break; } #endregion if (afterOneSort != null) afterOneSort(item, showType); } } /// <summary> /// 生成long随机数组 /// </summary> /// <param name="num">数组包含元素个数</param> /// <param name="isAsc">升序元素</param> /// <param name="continueNum">连续元素个数</param> /// <param name="minValue">最小值</param> /// <param name="maxValue">最大值</param> /// <returns>返回long随机数组</returns> static long[] BuildRandomArr(long num, bool isAsc = true, long continueNum = 1 , long minValue = Int64.MinValue, long maxValue = Int64.MaxValue) { List<long> lst = new List<long>(); Random random = new Random(new Guid().GetHashCode()); long i = 0; long temp = 0; for (i = 0; i continueNum <= num; i = i continueNum) { temp = random.NextLong(minValue, maxValue); long ii = 1; while (ii <= continueNum) { // 加入顺序元素 lst.Add(isAsc ? temp : temp--); ii ; } } if (i < num) // 不够最后一次的顺序元素continueNum { long ii = 1; long jj = num - i; while (ii <= jj) { // 加入顺序元素 lst.Add(isAsc ? temp : temp--); ii ; } } return lst.ToArray<long>(); } /// <summary> /// 本文示例都是升序,所以验证前面元素小于后面元素即可 /// </summary> static bool ValidateSort<T>(IList<T> arr) where T : IComparable<T> { if (arr == null) throw new ArgumentException("arr"); bool result = true; int length = arr.Count(); if (length > 1) { T beforeItem = default(T); // 循环n次 for (int i = 0; i <= length - 1; i ) { if (i == 0) { beforeItem = arr[i]; continue; } else { T afterItem = arr[i]; if (afterItem.CompareTo(beforeItem) < 0) { result = false; break; } beforeItem = arr[i]; } } } return result; } /// <summary> /// 显示排序后的结果 /// </summary> /// <param name="arr">已排序的数组</param> /// <param name="showType">显示那一类结果</param> static void ShowResult<T>(IList<T> arr, ResultType showType = ResultType.All) where T : IComparable<T> { int arrCount = arr.Count(); bool isSortOk = arrCount == 0 ? false : ValidateSort<T>(arr); if ((isSortOk && showType == ResultType.Error) || (!isSortOk && showType == ResultType.Success)) { return; } StringBuilder sb = new StringBuilder(); sb.Append(isSortOk ? "成功:" : "失败:"); if (arr.Count() == 0) { sb.Append("空元素"); } else { foreach (var subItem in arr) { sb.Append(subItem).Append(" "); } } if (!isSortOk) { // 排序失败的,红色显示,方便查看 ConsoleColor currentForeColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(sb.ToString()); Console.ForegroundColor = currentForeColor; } else { Console.WriteLine(sb.ToString()); } sb.Length = 0; } /// <summary> /// 排序结果类型 /// </summary> enum ResultType { /// <summary> /// 全部结果 /// </summary> All = 0, Success = 2, Error = 4, } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论