c# 怎么给一个数组排序,要求最有效率!求大神

我是一只小码农啦啦 2016-10-20 03:31:21
int[] a = new int[] { 1, -5, 13, 56, -78, 43, 2, 41, 234, 54, 90, 122, -5 };
//要求排序后从大到小输出前5个数 要最有效率 ,不要冒泡,不用for循环及.length
foreach (int t in arr)
{

}
...全文
4548 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zfp2017 2017-06-18
  • 打赏
  • 举报
回复
引用 27 楼 zhoujk 的回复:
[quote=引用 23 楼 yuanarea 的回复:] 谁知道 .sort() 是用什么算法排序的先,反正我不知道
不知道,只知道这帮大爷牛X得很。我自己写过归并排序(多核并行),子算法是快排,结果速度还比 Sort()慢一点。。。[/quote] 每个元素array必须实现IComparable<T>泛型接口,才能与中的每个其他元素的比较array。 如果未成功完成排序,结果不确定。 此方法使用反省排序 (introsort) 算法,如下所示︰ 分区大小是否少于 16 个元素,它使用insertion sort算法。 如果分区数超过 2 * 日志N,其中N是范围的输入数组,它使用Heapsort算法。 否则,它使用Quicksort算法。 此实现将执行不稳定排序;也就是说,如果两个元素相等,则可能不会保留其顺序。 与此相反,一个稳定排序保留相等的元素的顺序。 对于在最坏情况下使用 Heapsort 和快速排序算法排过序的数组,此方法为 O (n日志n) 操作,其中n是Length的array。 ↑来自MSDN
zhoujk 2016-10-23
  • 打赏
  • 举报
回复
引用 23 楼 yuanarea 的回复:
谁知道 .sort() 是用什么算法排序的先,反正我不知道
不知道,只知道这帮大爷牛X得很。我自己写过归并排序(多核并行),子算法是快排,结果速度还比 Sort()慢一点。。。
threenewbee 2016-10-21
  • 打赏
  • 举报
回复
orderby使用快速排序,效率足够高。
Rondapapi 2016-10-21
  • 打赏
  • 举报
回复
直接a.sort()就排序了,再去前五个就好了
qq_34463157 2016-10-21
  • 打赏
  • 举报
回复
用List集合 int[] a = new int[] { 1, -5, 13, 56, -78, 43, 2, 41, 234, 54, 90, 122, -5 }; List<int> SortNumber = new List<int> SortNumber(); SortNumber.AddRange(a); //将数组添加到List SortNumber.Sort();//排序集合
bigbaldy 2016-10-21
  • 打赏
  • 举报
回复
自带Sort为何不直接用,你再怎么写也没人家的快,如果是为了学习算法,为何连for都不让用?
飞天凤凰601 2016-10-21
  • 打赏
  • 举报
回复
int[] a = new int[] { -10, 1, 5, 9, -1, 20, 30, 0, 38 }; Array.Sort(a); for (int i = 0; i < 4; i++) { MessageBox.Show(a[i].ToString()); }
stherix 2016-10-21
  • 打赏
  • 举报
回复
如果只是输出某个大数组里面最大(小)的n个数(n较小)的话 ,冒泡算法和选择算法是很适合的,因为复杂度不高而且很容易设置终止条件 另外 一个int数组排序算法用foreach?你确定吗
  • 打赏
  • 举报
回复
引用 4 楼 Chinajiyong 的回复:
快速插入排序http://www.cnblogs.com/fatbird/p/SortAlgorithm.html
详细不错
aSalt 2016-10-21
  • 打赏
  • 举报
回复
谁知道 .sort() 是用什么算法排序的先,反正我不知道
Rondapapi 2016-10-21
  • 打赏
  • 举报
回复
之前的a.sort() 有问题。应该是 Array.Sort(a); Array.Reverse(a); Console.WriteLine("{0},{1},{2},{3},{4}", a[0], a[1], a[2], a[3], a[4]); Console.ReadLine():
aSalt 2016-10-21
  • 打赏
  • 举报
回复
如果怕递归占用 stack 或内存,就直接在 stack 里面操作
aSalt 2016-10-21
  • 打赏
  • 举报
回复
不要循环就递归好了
aSalt 2016-10-21
  • 打赏
  • 举报
回复
类似于.sort() 方法的速度很慢,在VC库就这样了,至于越复杂的语法吧,8成更慢
x20303 2016-10-20
  • 打赏
  • 举报
回复
九楼说的 对,赞同
我叫小菜菜 2016-10-20
  • 打赏
  • 举报
回复
如果只是需要前5个最大数,那完全可以逐个比较,先指定int max[5]={int.MinValue},一次扫描后就得到前5个最大数。效率为O(5*n)。 对于现有排序算法的一般效率O(n*logn),在logn>5即n大于32之后,要比排序都高效。 弊端是,不通用。
我叫小菜菜 2016-10-20
  • 打赏
  • 举报
回复
引用 5 楼 shingoscar 的回复:
Array.Sort(a);
正解。此乃局部最优解,集无数先贤之大成解。
  • 打赏
  • 举报
回复
对于你的问题,可以修改一下描述: 左边区域里的元素都不大于右边区域里的元素 --> 左边区域里的元素都不小于右边区域里的元素 跟什么for、.length 之类的语句其实没有关系。
  • 打赏
  • 举报
回复
一说到优化,有些人总是纠结个别语句、用什么编程语言的问题。其实真正的优化是结构、算法的优化。这就完全不是一个等级的优化概念。
  • 打赏
  • 举报
回复
跟小伎俩的语法没有关系。 排序有许多基本的算法,你找一本数据结构或者算法之类的入门书学习一下课程就知道如何计算其时间复杂度和空间复杂度了。其中那个“快速排序”基于划分算法,也就是说首先将集合划分为“左右”两个区域,左边区域里的元素都不大于右边区域里的元素。然后进行递归排序计算,最终排序成功。 根据你的这个问题,可以在划分之后,假设左边的区域的个数不小于5个,那么就直接丢掉右边的区域而不去递归排序,从而大大提高速度。而假设左边的区域小于5个,例如是n个,那么右边的区域也只需要(按照这个问题)递归排序前5-n个元素,而不需要将所有的元素都排序。 因此对于快速排序算法进行稍微的修改,改2、3条语句,就可以了。
加载更多回复(8)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧