рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдПрдХ рд╕рд╣рдпреЛрдЧреА рдХреЗ рдХрд╛рдо рдкрд░ рдкрдбрд╝рдиреЗ рд▓рдЧреЗред рдФрд░ рдХреЗрд╡рд▓ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реИред рдореИрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рджреЛ рд╕реВрдЪреА рдСрдмреНрдЬреЗрдХреНрдЯ рдереЗред рдкрд╣рд▓рд╛ рд╕рдВрджрд░реНрдн рдерд╛, рдФрд░ рджреВрд╕рд░рд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддрдм рд╢реАрдЯреЛрдВ рдХреА рддреБрд▓рдирд╛ рддрддреНрд╡ рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡ рд╕реЗ рдХреА рдЧрдИ рдереАред
рдкрд░реАрдХреНрд╖рдг рдХреНрд░реИрд╢ рдХрд╛ рдХрд╛рд░рдг рдЬрд▓реНрджреА рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛: рдПрдХ рд╕рд╣рдпреЛрдЧреА рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХрд╛ рдХреНрд░рдо рд╕рдВрджрд░реНрдн рд╕рд░рдгреА рдореЗрдВ рдХреНрд░рдо рдХрд╛ рдЙрд▓реНрдЯрд╛ рдерд╛ред рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдХреЗ рдХреЛрдб рдореЗрдВ, рд╣рдордиреЗ рдЕрдкрдиреЗ рддреБрд▓рдирд┐рддреНрд░ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ List.Sort рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рд╣рдореЗрд╢рд╛ 0. рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдкрд░ рдерд╛ рдХрд┐ рддрддреНрд╡ рдкреВрд░реА рдЯреАрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдХреНрд░рдо рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдП, рдФрд░ рдПрдХ рдХрд░реНрдордЪрд╛рд░реА рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрддред рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рд╣рдХрд░реНрдореА рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдерд╛ рдФрд░ mscorlib.dll рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╡рд╣ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрд▓рдЧ рдерд╛ред рдЗрд╕ рдкрд░ рдХреЛрдИ рднреА рд╢рд╛рдВрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЧрдпрд╛, рдореИрдВрдиреЗ рдЖрдЧреЗ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣реА рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ред
рдЫрдБрдЯрд╛рдИ рдХреЗ рдмрд╛рдж рдФрд░ рд╕рдорд╛рди рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╢реАрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдордПрд╕рдбреАрдПрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд▓рд┐рд╕реНрдЯрд╕реЙрд░реНрдЯ рдХреНрд╡рд┐рдХреЙрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЕрд╕реНрдерд┐рд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЧреЗред
рдпрд╣ рдХреЛрдб рд▓реЗрдВ:
рдХреЛрдбusing System; using System.Collections.Generic; namespace fkComparer { internal struct Smth { public int X; public int Y; } internal class SmthComparer : IComparer<Smth> { #region Implementation of IComparer<in smth> public int Compare(Smth x, Smth y) { Result.Count++; if(xY < yY) return -1; if(xY > yY) return 1; return 0; } #endregion } internal static class Result { public static int Count; } internal class Program { static void Main() { List<Smth> list = new List<Smth> {new Smth {X = 4, Y = 4}, new Smth {X = 5, Y = 4}, new Smth {X = 6, Y = 4}}; SmthComparer comparrer = new SmthComparer(); for (int i = 0; i < aaa.Count; i++) { Console.WriteLine(list[i].X); } Console.WriteLine("***************"); aaa.Sort(comparrer); Console.WriteLine(Result.Count); Console.WriteLine("***************"); for(int i = 0; i < aaa.Count; i++) { Console.WriteLine(list[i].X); } Console.ReadLine(); } } }
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВред рдПрдХ рд╕реНрдорде рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рддреБрд▓рдирд┐рддреНрд░ рд╣реИред рд╣рдо рд╢реАрдЯ рдХреЛ рддреБрд▓рдирд┐рддреНрд░ рдХреЗ рд╕рдорд╛рди рддреАрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрддреГрдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реАрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЬреЛ рддреБрд▓рдирд╛ рдХреА рдЧрдИ рдереА рдЙрд╕рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╢реАрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг рдХреНрдпрд╛ рд╣реИрдВред
.NET рдврд╛рдБрдЪрд╛ 4.0 рд╕рдВрд╕реНрдХрд░рдг mscorlib.dll 4.0.30319.17929 рдХрд╛4
5
6
***************
3
***************
4
5
6
.NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.0 рд╕рдВрд╕реНрдХрд░рдг mscorlib.dll 4.0.30319.180474
5
6
***************
7
***************
6
5
4
.NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.54
5
6
***************
3
***************
4
5
6
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред .NET рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЫрдБрдЯрд╛рдИ рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рддреАрди рддреБрд▓рдирд╛рдПрдБ рдХреА рдЬрд╛рддреА рд╣реИрдВред .NET 4.0 рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЫрдБрдЯрд╛рдИ рдЕрд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рд╕рд╛рдд (!) рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред .NET 4.5 рдореЗрдВ, рдЫрдВрдЯрдиреА рдлрд┐рд░ рд╕реЗ рдордЬрдмреВрдд рд╣реИ рдФрд░ 3 рддреБрд▓рдирд╛ рдлрд┐рд░ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред
рдпрд╛рдиреА .NET 4.0 рдХрд╛ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕рдорд╛рди рддрддреНрд╡реЛрдВ рдХреЛ рдзреАрдорд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рдорд╛рди рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ 100 рддрдХ рдмрдврд╝рд╛рдпрд╛ рдФрд░ .NET 4.0 - 813 рддреБрд▓рдирд╛ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛, рдФрд░ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ .NET 4.0 рдореЗрдВ рдФрд░ .NET 4.5 - 390 рдореЗрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ Microsoft рдиреЗ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдХрд┐рдпрд╛, рдлрд┐рд░ рдЧрд▓рдд, рдлрд┐рд░ рд╕рд╣реАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ рдУрд▓рдВрдкрд┐рдпрд╛рдб рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЖ рд╕рдХрддреА рд╣реИред
ZY: рдореИрдВрдиреЗ рдЕрдкрдиреА рдЦреБрдж рдХреА рд╕рд░рд▓рддрдо рддреБрд▓рдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рддреНрд╡рд░рд┐рдд рдЫрдВрдЯрдиреА рд▓рд┐рдЦреА:
рдХреЛрдб static void Sort(int left, int right) { int l = left; int r = right; Smth m = list[left + (right - left) / 2]; while(true) { Result.Count++; while(list[l].Y < mY) { l++; Result.Count++; } Result.Count++; while(list[r].Y > mY) { r--; Result.Count++; } if(l < r) { Smth t = list[l]; list[l] = list[r]; list[r] = t; l++; r--; } if(l >= r) break; } if(left < r) Sort(left, r); if(right > l) Sort(l, right); }
рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрд╕рдиреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕рдШрд╛рдд рдХрд┐рдпрд╛ рдХрд┐ рдХреЗрд╡рд▓ 744 рддреБрд▓рдирд╛рдПрдВ рдереАрдВред .NET 4.0 рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛рддреНрдордХ рдХреЙрд▓ рд╕реЗ рдХрдо рд╣реИ