Используется ли алгоритм сортировки by.NET массив `s'.Sort () ' метод стабильный алгоритм?
- это алгоритм сортировки, используемый .NET Array.Sort() метод a стабильный?
5 ответов:
с MSDN:
эта реализация выполняет неустойчивую сортировку; то есть, если два элемента равны, их порядок не может быть сохранен. Напротив, стабильная сортировка сохраняет порядок элементов, которые равны.
сортировка использует интроспективную сортировку. (Quicksort в версии 4.0 и более ранних версий платформы .NET framework).
Если вам нужна стабильная сортировка, вы можете использовать перечисли.Заказатьпо.
добавлять к ответ Расмуса Фабера...
сортировка в LINQ, через перечисли.Заказатьпо и перечисли.Тогда тэнби, является стабильной реализацией сортировки, которая может быть использована в качестве альтернативы массив.Сортировка. От перечисли.Документация OrderBy по адресу MSDN:
этот метод выполняет стабильную сортировку; то есть, если ключи двух элементов равны, порядок элементов есть консервированный. В отличие от нестабильной сортировка не сохраняет порядок элементы, которые имеют тот же ключ.
кроме того, любая нестабильная реализация сортировки, например
Array.Sort, можно стабилизировать, используя положение элементов в исходной последовательности или массиве в качестве дополнительного ключа, чтобы служить в качестве выключателя связи. Ниже приводится одна такая реализация, как общий метод расширения на любом одномерном массиве и который получаетсяArray.Sortв стабильную сортировка:using System; using System.Collections.Generic; public static class ArrayExtensions { public static void StableSort<T>(this T[] values, Comparison<T> comparison) { var keys = new KeyValuePair<int, T>[values.Length]; for (var i = 0; i < values.Length; i++) keys[i] = new KeyValuePair<int, T>(i, values[i]); Array.Sort(keys, values, new StabilizingComparer<T>(comparison)); } private sealed class StabilizingComparer<T> : IComparer<KeyValuePair<int, T>> { private readonly Comparison<T> _comparison; public StabilizingComparer(Comparison<T> comparison) { _comparison = comparison; } public int Compare(KeyValuePair<int, T> x, KeyValuePair<int, T> y) { var result = _comparison(x.Value, y.Value); return result != 0 ? result : x.Key.CompareTo(y.Key); } } }Ниже приведен пример программы, используя
StableSortсверху:static class Program { static void Main() { var unsorted = new[] { new Person { BirthYear = 1948, Name = "Cat Stevens" }, new Person { BirthYear = 1955, Name = "Kevin Costner" }, new Person { BirthYear = 1952, Name = "Vladimir Putin" }, new Person { BirthYear = 1955, Name = "Bill Gates" }, new Person { BirthYear = 1948, Name = "Kathy Bates" }, new Person { BirthYear = 1956, Name = "David Copperfield" }, new Person { BirthYear = 1948, Name = "Jean Reno" }, }; Array.ForEach(unsorted, Console.WriteLine); Console.WriteLine(); var unstable = (Person[]) unsorted.Clone(); Array.Sort(unstable, (x, y) => x.BirthYear.CompareTo(y.BirthYear)); Array.ForEach(unstable, Console.WriteLine); Console.WriteLine(); var stable = (Person[]) unsorted.Clone(); stable.StableSort((x, y) => x.BirthYear.CompareTo(y.BirthYear)); Array.ForEach(stable, Console.WriteLine); } } sealed class Person { public int BirthYear { get; set; } public string Name { get; set; } public override string ToString() { return string.Format( "{{ BirthYear = {0}, Name = {1} }}", BirthYear, Name); } }Ниже приведен вывод из примера программы выше (работает на машине с Windows Vista SP1 и .NET Framework 3.5 SP1 установлен):
{ BirthYear = 1948, Name = Cat Stevens } { BirthYear = 1955, Name = Kevin Costner } { BirthYear = 1952, Name = Vladimir Putin } { BirthYear = 1955, Name = Bill Gates } { BirthYear = 1948, Name = Kathy Bates } { BirthYear = 1956, Name = David Copperfield } { BirthYear = 1948, Name = Jean Reno } { BirthYear = 1948, Name = Jean Reno } { BirthYear = 1948, Name = Kathy Bates } { BirthYear = 1948, Name = Cat Stevens } { BirthYear = 1952, Name = Vladimir Putin } { BirthYear = 1955, Name = Bill Gates } { BirthYear = 1955, Name = Kevin Costner } { BirthYear = 1956, Name = David Copperfield } { BirthYear = 1948, Name = Cat Stevens } { BirthYear = 1948, Name = Kathy Bates } { BirthYear = 1948, Name = Jean Reno } { BirthYear = 1952, Name = Vladimir Putin } { BirthYear = 1955, Name = Kevin Costner } { BirthYear = 1955, Name = Bill Gates } { BirthYear = 1956, Name = David Copperfield }
Как и другие ответы, массив.Сортировка не стабильна. Однако методы LINQ OrderBy (и OrderByDescending и т. д.) are конюшня, которая может быть очень полезна.
нет,не:
этот метод использует алгоритм быстрой сортировки. Эта реализация выполняет нестабильную сортировку
обновление: этот код не стабилизирует массив.Сортировка (убедитесь, что элементы всегда сортируются в том же порядке):
public static class ComparisonExtensions { public static Comparison<T> WithGetHashCode<T>(this Comparison<T> current) { return (x, y) => { var result = current(x, y); if (result == 0) return x.GetHashCode() - y.GetHashCode(); return result; }; } }использование:
Comparison<Person> comparison = (x, y) => x.BirthYear.CompareTo(y.BirthYear); Array.Sort(unstable, comparison.WithGetHashCode());
Comments