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)
{
//要求排序后从大到小输出前5个数 要最有效率 ,不要冒泡,不用for循环及.length
foreach (int t in arr)
{
}
解决方案
5
2
直接用linq的排序不行吗
15
2
Array.Sort(a);
2
int[] a = new int[] { 1, -5, 13, 56, -78, 43, 2, 41, 234, 54, 90, 122, -5 }; int[] arr = a.OrderByDescending(x => x).Where((y, i) => i < 5).ToArray(); foreach(int x in arr) { Console.WriteLine(x); }
5
跟小伎俩的语法没有关系。
排序有许多基本的算法,你找一本数据结构或算法之类的入门书学习一下课程就知道怎么样计算其时间复杂度和空间复杂度了。其中那个“快速排序”基于划分算法,也就是说首先将集合划分为“左右”两个区域,左边区域里的元素都不大于右边区域里的元素。然后进行递归排序计算,最终排序成功。
根据你的这个问题,可以在划分之后,假设左边的区域的个数不小于5个,那么就直接丢掉右边的区域而不去递归排序,从而大大提高速度。而假设左边的区域小于5个,例如是n个,那么右边的区域也只需要(按照这个问题)递归排序前5-n个元素,而不需要将全部的元素都排序。
因此对于快速排序算法进行稍微的修改,改2、3条语句,就可以了。
排序有许多基本的算法,你找一本数据结构或算法之类的入门书学习一下课程就知道怎么样计算其时间复杂度和空间复杂度了。其中那个“快速排序”基于划分算法,也就是说首先将集合划分为“左右”两个区域,左边区域里的元素都不大于右边区域里的元素。然后进行递归排序计算,最终排序成功。
根据你的这个问题,可以在划分之后,假设左边的区域的个数不小于5个,那么就直接丢掉右边的区域而不去递归排序,从而大大提高速度。而假设左边的区域小于5个,例如是n个,那么右边的区域也只需要(按照这个问题)递归排序前5-n个元素,而不需要将全部的元素都排序。
因此对于快速排序算法进行稍微的修改,改2、3条语句,就可以了。
3
假如只是需要前5个最大数,那完全可以逐个比较,先指定int max[5]={int.MinValue},一次扫描后就得到前5个最大数。效率为O(5*n)。
对于现有排序算法的一般效率O(n*logn),在logn>5即n大于32之后,要比排序都高效。
弊端是,不通用。
对于现有排序算法的一般效率O(n*logn),在logn>5即n大于32之后,要比排序都高效。
弊端是,不通用。
3
orderby使用快速排序,效率足够高。
2
自带Sort为何不直接用,你再怎么写也没人家的快,假如是为了学习算法,为何连for都不让用?
6
用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();//排序集合
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();//排序集合
6
直接a.sort()就排序了,再去前五个就好了
3
相似于.sort() 方法的速度很慢,在VC库就这样了,至于越复杂的语法吧,8成更慢
2
假如怕递归占用 stack 或内存,就直接在 stack 里面操作