只是为了好玩我建在C#中的快速排序实现使用LINQ:快速排序LINQ的性能优势通过T []对的IEnumerable <T>
public static IEnumerable<T> quicksort<T>(IEnumerable<T> input) where T : IComparable<T>{
if (input.Count() <= 1) return input;
var pivot = input.FirstOrDefault();
var lesser = quicksort(input.Skip(1).Where(i => i.CompareTo(pivot) <= 0));
var greater = quicksort(input.Where(i => i.CompareTo(pivot) > 0));
return lesser.Append(pivot).Concat(greater);
}
它在大约13秒10000个排序随机整数。
将其更改为使用int []而不是List结果的性能会提高约700倍!对相同的10000个随机整数只需要21ms。
public static T[] quicksortArray<T>(T[] input) where T : IComparable<T>{
if (input.Count() <= 1) return input;
var pivot = input.FirstOrDefault();
var lesser = quicksortArray(input.Skip(1).Where(i => i.CompareTo(pivot) <= 0).ToArray());
var greater = quicksortArray(input.Where(i => i.CompareTo(pivot) > 0).ToArray());
return lesser.Append(pivot).Concat(greater).ToArray();
}
只看我会认为这将有更坏 性能的代码。我认为.ToArray()会在内存中创建一个额外的数组,并在那里复制所有整数。 我认为传递数组与传递列表应该大致相同。
那么这个巨大的性能差异从哪里来?
https://ideone.com/E5ASv7,https://ideone.com/DAUfmB – Ryan
将'quicksortArray'与'Array进行比较后,您可能会感到有些惊讶。排序'也 – Slai
@Slai我知道这是不高效的,不会使用它的任何事情:-) – marv51