рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдп рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ - .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЫрдВрдЯрдиреА рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ .NET рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрд░рд┐рдпрд░реНрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдлреАрдЪрд░реНрд╕, рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝реА рддреБрд▓рдирд╛ рднреА рдХрд░рддреЗ рд╣реИрдВред
рддреЛ, рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, .NET рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд╡рд░рд┐рдд рд╕реЙрд░реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░:
рд▓рд╛рдн:- рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд▓реЗ рдЖрдВрддрд░рд┐рдХ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ (рдЕрднреНрдпрд╛рд╕ рдореЗрдВ);
- рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди;
- рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ O (logn) рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ, O (n) рдореЗрдореЛрд░реА);
- рдпрд╣ рдХреИрд╢рд┐рдВрдЧ рдФрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдиреБрдХрд╕рд╛рди:- рдпрд╣ рд╕рд╣рд╛рдпрдХ рддрддреНрд╡реЛрдВ рдХреЗ рдЕрд╕рдлрд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде O (n 2 ) рдХреА рдЧрддрд┐ рдореЗрдВ рдмрд╣реБрдд рдЧрд┐рд░рд╛рд╡рдЯ рд▓рд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрд╕рдлрд▓ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╕рдорд░реНрдерди рддрддреНрд╡ рдЪреБрдирдХрд░ рдЗрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рди рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ;
- рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдПрдХ рднреЛрд▓реЗ-рднрд╛рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ O (n) рдиреЗрд╕реНрдЯреЗрдб рд░рд┐рд░реНрд╕рд┐рд╡ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдмреЗрд╣рддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗрд╡рд▓ рд╕рд░рдгреА рдХреЗ рджреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдЫреЛрдЯреЗ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ O (logn) рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ;
- рдЕрд╕реНрдерд┐рд░ - рдпрджрд┐ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреБрдВрдЬреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдПрдХ рддреНрд╡рд░рд┐рдд рд╕реЙрд░реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рднреЛрд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:
Naive QuickSortpublic void QuickSort(int left, int right) { int l = left; int r = right; int avg = array[(l + r) / 2)]; do { while (array[l] < avg) ++l; while (array[r] > avg) --r; if (l <= r) { if (l < r) { int temp = array[l]; array[l] = array[r]; array[r] = temp; } ++l; --r; } } while (l <= r); if (left < r) QuickSort(left, r); if (l < right) QuickSort(l, right); }
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреБрдХрд╕рд╛рди рд╣реИрдВ:- рдЪреВрдВрдХрд┐ рд╕рдорд░реНрдерди рддрддреНрд╡ рдХреЛ рд╕рд░рдгреА рдХреЗ рдордзреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЕрдзрд┐рдХрддрдо рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рд░рдгреА рдХреЛ рд▓рдВрдмрд╛рдИ n - 1 рдФрд░ 1 рдХреЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЧрддрд┐ O (n 2 ) рддрдХ рдиреАрдЪрд╛ рд╣реЛ рдЬрд╛рдПрдЧреА;
- рдЙрдкрд░реЛрдХреНрдд рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдУ (рдПрди) рддрдХ рдкрд╣реБрдВрдЪрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмрдбрд╝реЗ рдПрди рдХреЗ рд▓рд┐рдП, рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ;
- рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рд╕рдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рддрддреНрд╡реЛрдВ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдирдВрдмрд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░, рдпрд╣ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рднреА рд╕рдВрдкрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЙрд░реНрдЯ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХрдИ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдРрд╕реЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдорд┐рд▓реЗрдЧреА, рдЬрд┐рдирдХрд╛ рдХреНрд░рдо рдЕрд▓рдЧ рд╣реИред
рд╣рдо .NET рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред.NET 1.0
рддреЛ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ .NET 1.0 рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╣рддрд╛ рд╣реВрдБ рдХрд┐ рд╣рдордиреЗ рдпрд╣рд╛рдБ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рджреЗрдЦрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП ... (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг)
public static void Sort(Array array) { Array.Sort(array, (Array) null, array.GetLowerBound(0), array.Length, (IComparer) null); } public static void Sort(Array keys, Array items, int index, int length, IComparer comparer) { if (length > 1) { if (comparer == Comparer.Default || comparer == null) { if(TrySZSort(array, null, index, index + length - 1)) { return; } } object[] keys1 = keys as object[]; object[] items1 = (object[]) null; if (keys1 != null) items1 = items as object[]; if (keys1 != null && (items == null || items1 != null)) new Array.SorterObjectArray(keys1, items1, comparer).QuickSort(index, index + length - 1); else new Array.SorterGenericArray(keys, items, comparer).QuickSort(index, index + length - 1); }
рдФрд░ рдЕрдм SorterObjectArray рдФрд░ SorterGenericArray рд╕реНрд╡рдпрдВ рдХрдХреНрд╖рд╛рдПрдВ:
SorterObjectArray private class SorterObjectArray { private object[] keys; private object[] items; private IComparer comparer; public SorterObjectArray(object[] keys, object[] items, IComparer comparer) { if (comparer == null) comparer = (IComparer)Comparer.Default; this.keys = keys; this.items = items; this.comparer = comparer; } public virtual void QuickSort(int left, int right) { do { int left1 = left; int right1 = right; object obj1 = this.keys[left1 + right1 >> 1]; do { while (this.comparer.Compare(this.keys[left1], obj1) < 0) ++left1; while (this.comparer.Compare(obj1, this.keys[right1]) < 0) --right1; if (left1 <= right1) { if (left1 < right1) { object obj2 = this.keys[left1]; this.keys[left1] = this.keys[right1]; this.keys[right1] = obj2; if (this.items != null) { object obj3 = this.items[left1]; this.items[left1] = this.items[right1]; this.items[right1] = obj3; } } ++left1; --right1; } else break; } while (left1 <= right1); if (right1 - left <= right - left1) { if (left < right1) this.QuickSort(left, right1); left = left1; } else { if (left1 < right) this.QuickSort(left1, right); right = right1; } } while (left < right); } }
SorterGenericArray private class SorterGenericArray { private Array keys; private Array items; private IComparer comparer; public SorterGenericArray(Array keys, Array items, IComparer comparer) { if (comparer == null) comparer = (IComparer)Comparer.Default; this.keys = keys; this.items = items; this.comparer = comparer; } public virtual void QuickSort(int left, int right) { do { int num1 = left; int num2 = right; object obj1 = this.keys.GetValue(num1 + num2 >> 1); do { while (this.comparer.Compare(this.keys.GetValue(num1), obj1) < 0) ++num1; while (this.comparer.Compare(obj1, this.keys.GetValue(num2)) < 0) --num2; if (num1 <= num2) { if (num1 < num2) { object obj2 = this.keys.GetValue(num1); this.keys.SetValue(this.keys.GetValue(num2), num1); this.keys.SetValue(obj2, num2); if (this.items != null) { object obj3 = this.items.GetValue(num1); this.items.SetValue(this.items.GetValue(num2), num1); this.items.SetValue(obj3, num2); } } ++num1; --num2; } else break; } while (num1 <= num2); if (num2 - left <= right - num1) { if (left < num2) this.QuickSort(left, num2); left = num1; } else { if (num1 < right) this.QuickSort(num1, right); right = num2; } } while (left < right); } }
рддреЛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб
object[] keys1 = keys as object[]; object[] items1 = (object[]) null; if (keys1 != null) items1 = items as object[];
рдпрд╣ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕реЙрд░реНрдЯрд░рдСрдмреНрдЬреЗрдХреНрдЯрдЕрд░реЗ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реЙрд░реНрдЯрд░рдЧреЗрдВрд░рд┐рдХреЗрд░рд┐рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП, рдпреЗ рд╡рд░реНрдЧ рдЕрд▓рдЧ рдХреИрд╕реЗ рд╣реИрдВ? рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рдХреЗрд╡рд▓ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, GetValue рдФрд░ SetValue рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╣реИрдВ ... рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рд╕рд░рдгреА рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЫрдВрдЯреЗрдЧреА (рдЖрдЦрд┐рд░рдХрд╛рд░, рдкреВрд░реНрдгрд╛рдВрдХ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рд╣реИ)? рдирд╣реАрдВ! рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдЬрд▓реНрджреА рдФрд░ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ
if (length > 1) { if (comparer == Comparer.Default || comparer == null) { if(TrySZSort(array, null, index, index + length - 1)) return; } }
рдмреНрдпрд╛рдЬ рдХреА Array.TrySZSort рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ C ++ рдореЗрдВ C ++ рдореЗрдВ рд▓рд╛рдЧреВ рдореВрд▓ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╣рдо рддрддреНрд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдЬрдм = = Comparer.Default || рддреБрд▓рдирд┐рддреНрд░ == рдЕрд╢рдХреНрддред
рдФрд░ рдпрд╣рд╛рдБ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
рдореВрд▓ рдирд┐рд╡рд╛рд╕реА TrySZSort FCIMPL4(INT32, ArrayHelper::TrySZSort, ArrayBase * keys, ArrayBase * items, UINT32 left, UINT32 right)
рдиреЗрдЯрд┐рд╡ рдХреНрд╡рд┐рдХреЙрд░реНрдЯ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рджреЗрд╢реА рдЫрдВрдЯрд╛рдИ рдХреЗрд╡рд▓ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЗрдирдореЗрдВ рд╕рднреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ + рддрд╛рд░реНрдХрд┐рдХ + рд╡рд░реНрдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рд╣рдо рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рд╣рдо SorterObjectArray рд╡рд░реНрдЧ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЛрдиреЛрдВ рд╕рдорд╛рди рд╣реИрдВред
1. рд╕рд░рдгреА рдХрд╛ рдордзреНрдп рд╣рдореЗрд╢рд╛ рд╕рд╣рд╛рдпрдХ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
object obj1 = this.keys[left1 + right1 >> 1];
рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЦрд░рд╛рдм рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рджреНрд╡рд┐рдШрд╛рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреАрдЪ рдХреЛ рдлреЙрд░реНрдореВрд▓рд╛ num1 + num2 >> 1 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЯрд╛рдЗрдк int рдХрд╛ рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рдореЗрдВ рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдФрд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдХреА рдЧрдИ рдереА (
рдмрдЧ рд╕реЗ рд▓рд┐рдВрдХ )ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк .NET рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдпрд╣ рджреЛрд╖ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
2. рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреБрдХреВрд▓рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдПрдХ рд╢рд╛рдЦрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ: рд╕рд░рдгреА рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рджреЛрдиреЛрдВ рдкрд╛рдП рдЧрдП рдЙрдк-рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреБрди: рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗрд╡рд▓ рдЫреЛрдЯреЗ рдЙрдк-рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмрдбрд╝рд╛ рдПрдХ рд▓реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ рдХреЗ рднреАрддрд░ред рджрдХреНрд╖рддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдФрд╕рдд рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ: рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреА рдУрд╡рд░рд╣реЗрдб рд▓рд╛рдЧрдд рдФрд░ рдЙрдк-рд▓рдВрдмрд╛рдИ рдФрд░ рд▓реВрдк рдХреА рд▓рдВрдмрд╛рдИ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рд╕рдорд╛рди рдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ, рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд▓реЙрдЧ
2 рдПрди рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧреА, рдФрд░ рдкрддрд┐рдд рдЕрд▓рдЧрд╛рд╡ рдХреЗ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ 2 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд╕рднреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрддрд░ рдХреЗ рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рд╣реЛрдВрдЧреЗред
.NET 2.0
рдирдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рд╣реБрдП рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг .NET 2.0 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк рджреВрдВрдЧрд╛ред
public static void Sort<T>(T[] array, int index, int length, IComparer<T> comparer) {
рдФрд░ рдпрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рд╕реЙрд░реНрдЯ рдХрд░рддреА рд╣реИ
quicksort private static void SwapIfGreaterWithItems(T[] keys, IComparer<T> comparer, int a, int b) { if (a == b || comparer.Compare(keys[a], keys[b]) <= 0) return; T obj = keys[a]; keys[a] = keys[b]; keys[b] = obj; } internal static void QuickSort(T[] keys, int left, int right, IComparer<T> comparer) { do { int index1 = left; int index2 = right; int index3 = index1 + (index2 - index1 >> 1); ArraySortHelper<T>.SwapIfGreaterWithItems(keys, comparer, index1, index3); ArraySortHelper<T>.SwapIfGreaterWithItems(keys, comparer, index1, index2); ArraySortHelper<T>.SwapIfGreaterWithItems(keys, comparer, index3, index2); T obj1 = keys[index3]; do { while (comparer.Compare(keys[index1], obj1) < 0) ++index1; while (comparer.Compare(obj1, keys[index2]) < 0) --index2; if (index1 <= index2) { if (index1 < index2) { T obj2 = keys[index1]; keys[index1] = keys[index2]; keys[index2] = obj2; } ++index1; --index2; } else break; } while (index1 <= index2); if (index2 - left <= right - index1) { if (left < index2) ArraySortHelper<T>.QuickSort(keys, left, index2, comparer); left = index1; } else { if (index1 < right) ArraySortHelper<T>.QuickSort(keys, index1, right, comparer); right = index2; } } while (left < right); }
рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдгреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж (рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ) рдЕрднреА рднреА рд╣реИред рдпрд╣реА рд╣реИ, рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА рджреЗрд╢реА рдЫрдБрдЯрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдВрджрд░реНрдн рддрддреНрд╡ рдЕрдм рд╕рд░рдгреА рдХрд╛ рдордзреНрдп рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рд░рдгреА рдХреЗ рдкрд╣рд▓реЗ, рдордзреНрдп рдФрд░ рдЕрдВрддрд┐рдо рддрддреНрд╡реЛрдВ рдХрд╛ рдордзреНрдп рд╣реИред
int index3 = index1 + (index2 - index1 >> 1);
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдм рдордзреНрдп рдХреА рдЧрдгрдирд╛ рд╕реВрддреНрд░ index1 + (index2 - index1 >> 1) рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдЬреБрдбрд╝реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЕрдиреНрдпрдерд╛, рд╕рдм рдХреБрдЫ рдЕрднреА рднреА рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИред
рдЕрдм рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░: рд╣рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдЕрд╡рд░реЛрд╣реА рд╕рд░рдгреА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ?
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдирд┐рдореНрди рдХреЛрдб
Array.Sort(a); Array.Reverse(a);
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд▓рдЧрднрдЧ 3 рдЧреБрдирд╛ рддреЗрдЬ рдЪрд▓рддрд╛ рд╣реИ
Array.Sort(a, (x, y) => -x.CompareTo(y))
рдЖрдк рдЗрд╕ рддрдереНрдп рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Array.Reverse рд╡рд┐рдзрд┐ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕рд╛рд░реНрдердХ рдкреНрд░рдХрд╛рд░реЛрдВ (рдкреИрдХреЗрдЬрд┐рдВрдЧ рдФрд░ рдЧреЗрдЯрд╡реИрд▓реНрдпреВ, рд╕реЗрдЯрд╡реИрд▓реНрдпреВ рд╡рд┐рдзрд┐рдпреЛрдВ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдлрд┐рд░ рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╛рд░реНрдердХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддреН рджреЗрд╢реА Array.TrySZReverse рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рд░рд┐рд╡рд░реНрд╕ template <class KIND> static void Reverse(KIND array[], UINT32 index, UINT32 count) { if (count == 0) { return; } UINT32 i = index; UINT32 j = index + count - 1; while(i < j) { KIND temp = array[i]; array[i] = array[j]; array[j] = temp; i++; j--; } } };
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рд╣рдореЗрдВ рд╣рд░ рдХреЛрдиреЗ рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░рд╡рд╛рддрд╛ рд╣реИред
рд╡реИрд╕реЗ, рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИред Enumerable рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд░рд┐рд╡рд░реНрд╕ рд╡рд┐рдзрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЦрд╛рдореА рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЬрдЧрд╣ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ Array.Reverse рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдСрдЯреЛ-рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
.NET 3.0 - .NET 4.0
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред
.NET 4.5
рдордЬрд╝рд╛ рдпрд╣рд╛рдБ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ!
рд▓реЗрдХрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ .NET 4.5 рдХреА рддреИрдирд╛рддреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣рдиреЗ рдЪрд╛рд╣рд┐рдПред рд╕реНрдерд┐рддрд┐ рдХреА рдкреВрд░реА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдпрд╣
рд▓реЗрдЦ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ) рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рд╡реАрдПрд╕ 2012 рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЕрд░реНрдерд╛рдд .NET 4.5 рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдпрд╣ 4 рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдЕрдм .NET 4 рдореЗрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддрдм рднреА рдЖрдк .NET 4.5 рдмрд┐рд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдирд┐рдХрд▓рддреА рд╣реИ: 4.5 рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рдПрдХ рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж рдЖрдк рдПрдХ рдЕрд▓рдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдм рдХреБрдЫ рдЖрдкрдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рд╣реЛрддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, .NET 4.5 рдХреЗ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
public void Sort(T[] keys, int index, int length, IComparer<T> comparer) { if (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5) ArraySortHelper<T>.IntrospectiveSort(keys, index, length, comparer); else ArraySortHelper<T>.DepthLimitedQuickSort(keys, index, length + index - 1, comparer, 32); }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдПрдХ рдЬрд╛рдВрдЪ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ .NET рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдпрджрд┐ рдпрд╣ 4.5 рд╣реИ, рддреЛ рд╣рдо IntrospectiveSort рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдпрд╣ 4.0 рд╣реИ рддреЛ DepthLimitedQuickSortред
рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рд╡реАрдПрд╕ 2012 рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ .NET 4.0 рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд╕реЗ рдбреЗрдкреНрдереЗрд▓реНрдлрд╝реЗрдбрдХреНрд╡рд╛рдЗрдХрд▓ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
DepthLimitedQuickSort internal static void DepthLimitedQuickSort(T[] keys, int left, int right, IComparer<T> comparer, int depthLimit) { while (depthLimit != 0) { int index1 = left; int index2 = right; int index3 = index1 + (index2 - index1 >> 1); ArraySortHelper<T>.SwapIfGreater(keys, comparer, index1, index3); ArraySortHelper<T>.SwapIfGreater(keys, comparer, index1, index2); ArraySortHelper<T>.SwapIfGreater(keys, comparer, index3, index2); T obj1 = keys[index3]; do { while (comparer.Compare(keys[index1], obj1) < 0) ++index1; while (comparer.Compare(obj1, keys[index2]) < 0) --index2; if (index1 <= index2) { if (index1 < index2) { T obj2 = keys[index1]; keys[index1] = keys[index2]; keys[index2] = obj2; } ++index1; --index2; } else break; } while (index1 <= index2); --depthLimit; if (index2 - left <= right - index1) { if (left < index2) ArraySortHelper<T>.DepthLimitedQuickSort(keys, left, index2, comparer, depthLimit); left = index1; } else { if (index1 < right) ArraySortHelper<T>.DepthLimitedQuickSort(keys, index1, right, comparer, depthLimit); right = index2; } if (left >= right) return; } ArraySortHelper<T>.Heapsort(keys, left, right, comparer); }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдПрдХ рд╣реА рддреНрд╡рд░рд┐рдд рд╕реЙрд░реНрдЯ рд╣реИ: рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд┐рд░рд╛рдорд┐рдб рдХреА рддрд░рд╣ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 32 рд╣реИред
рдФрд░ рдпрд╣рд╛рдБ рдкрд┐рд░рд╛рдорд┐рдб рдХреА рдЦреБрдж рдХреА рдЫрдБрдЯрд╛рдИ рд╣реИ:
Heapsort private static void Heapsort(T[] keys, int lo, int hi, IComparer<T> comparer) { int n = hi - lo + 1; for (int i = n / 2; i >= 1; --i) ArraySortHelper<T>.DownHeap(keys, i, n, lo, comparer); for (int index = n; index > 1; --index) { ArraySortHelper<T>.Swap(keys, lo, lo + index - 1); ArraySortHelper<T>.DownHeap(keys, 1, index - 1, lo, comparer); } } private static void DownHeap(T[] keys, int i, int n, int lo, IComparer<T> comparer) { T x = keys[lo + i - 1]; for (; i <= n / 2; { int num; i = num;}) { num = 2 * i; if (num < n && comparer.Compare(keys[lo + num - 1], keys[lo + num]) < 0) ++num; if (comparer.Compare(x, keys[lo + num - 1]) < 0) keys[lo + i - 1] = keys[lo + num - 1]; else break; } keys[lo + i - 1] = x; }
DepthLimitedQuickSort рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо IntroSort рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред
рдЗрдВрдЯреНрд░реЛрд╕реЛрд░реНрдЯ, рдпрд╛ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдЫрдБрдЯрд╛рдИ, 1997 рдореЗрдВ рдбреЗрд╡рд┐рдб рдореВрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдХ рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИред рдЬрдм рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдХреБрдЫ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрддрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИ рддреЛ рдпрд╣ рдкрд┐рд░рд╛рдорд┐рдб рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдФрд░ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рд╣реЗ (рдПрди рд▓реЙрдЧ рдПрди) рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреА рддрд╛рдХрдд рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рджреЛрдиреЛрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рддреБрд▓рдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рднреА рддреБрд▓рдирд╛ рдЖрдзрд╛рд░рд┐рдд рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИредрдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдВрдЯреНрд░реЛрд╕реНрдкреЗрдХреНрдЯрд┐рд╡рд╕реЙрд░реНрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рд╣реА рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдЫрдБрдЯрд╛рдИ рд╣реИ, рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рддред рд╡реИрд╕реЗ, MSDN рдЕрднреА рднреА рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддреЗрдЬреА рд╕реЗ рдЫрдБрдЯрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
IntroSort private static void IntroSort(T[] keys, int lo, int hi, int depthLimit, IComparer<T> comparer) { for (; hi > lo; {int num; hi = num - 1;}) { int num = hi - lo + 1; if (num <= 16)
рдЕрдм рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдЫрдВрдЯрд╛рдИ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реИ: рд╕рдореНрдорд┐рд▓рди рдЫрдБрдЯрд╛рдИ, рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдФрд░ рдкрд┐рд░рд╛рдорд┐рдб рдЫрдБрдЯрд╛рдИред
Introsort рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрд╡реЗрд╖рдг рджреНрд╡рд╛рд░рд╛ рдЫрд╛рдВрдЯрдирд╛ рдРрд╕реЗ рдбреЗрдЯрд╛ рдкрд░ рдмрд╣реБрдд рдЬрд▓реНрджреА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛

рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛
рдЫрд╛рдВрдЯрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, Java .NET рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрд╛рд╡рд╛ рдореЗрдВ .NET рдХреЗ рд░реВрдк рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рднреА рдмрджрд▓ рдЧрдпрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЗрдЬреА рд╕реЗ рдЫрдБрдЯрд╛рдИ рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдЬреЛ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫрд╛рдВрдЯрддреЗ рд╕рдордп рдПрдХ рдиреБрдХрд╕рд╛рди рд╣реИред рдЪреВрдБрдХрд┐ рдЬрд╛рд╡рд╛ тАЬрдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рддрд░рд╣тАЭ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд░реНрдЬ рд╕реЙрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЫрдБрдЯрд╛рдИ рдордЬрдмреВрдд рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ O (n logn) рд░рди рдЯрд╛рдЗрдо рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреЗ рд▓рд┐рдП O (n) рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЪреВрдВрдХрд┐ рд╕реНрдерд┐рд░рддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╣реА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдЖрджрд┐рдореЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдПрдХ рдмреЗрд╣рддрд░ рдХреНрд╡рд┐рдХ рд╕реЙрд░реНрдЯ рдЕрд▓реНрдЧреЛрд░рд┐рдердо, рдбреНрдпреВрд▓рдкреЙрдЗрдВрдЯрдХреНрд╡рд┐рд╕реНрдХреЙрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╡рд┐рдХреЙрд░реНрдЯ рдиреЗ рд╕рд░рдгреА рдХреЛ рджреЛ рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддрддреНрд╡ рдкреАред рддрдм рдпрд╣ рд╕рд░рдгреА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреА рд╕реЗ рдХрдо рд╕рднреА рддрддреНрд╡ рдкрд╣рд▓реЗ рдЦрдВрдб рдореЗрдВ рдФрд░ рдмрд╛рдХреА рджреВрд╕рд░реЗ рдореЗрдВ рдЧрд┐рд░реЗред рдлрд┐рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рдЦрдВрдб рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред DualPivotQuicksort рджреЛ рдХреЗ рдмрдЬрд╛рдп рд╕рд░рдгреА рдХреЛ рддреАрди рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЪрд▓рддреА рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛рдлреА рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдЬрд╛рд╡рд╛ 7 рдореЗрдВ, рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЯрд┐рдорд╕реЙрд░реНрдЯ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред
Timsort рдПрдХ рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ рдЬреЛ 2002 рдореЗрдВ рдЯрд┐рдо рдкреАрдЯрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдорд░реНрдЬ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдорд┐рд▓рд╛рддрд╛ рд╣реИред Timsort рд╡рд░реНрддрдорд╛рди рдореЗрдВ Python, OpenJDK 7 рдореЗрдВ рдорд╛рдирдХ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИ, рдФрд░ Android JDK 1.5 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рдЖрджреЗрд╢рд┐рдд рд╕рдмрд░реЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВред рдРрд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рдХрдИ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯрд┐рдореНрд╕реЙрд░реНрдЯ рдХрд╛рдлреА рддреЗрдЬ рд╣реИредTimsort рддреЗрдЬрд╝ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛ рдкрд░ рдпрд╣ рддреЗрдЬрд╝ рдЫрдБрдЯрд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 30 рдкреНрд░рддрд┐рд╢рдд рд╣реАрди рд╣реИред
рджреЛ рдврд╛рдБрдЪреЛрдВ рдореЗрдВ рдЫрдБрдЯрд╛рдИ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЗрд╕ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдореГрддрд┐ рдкрд░ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдпрд╛ рдЖрдк рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЧрддрд┐ рдФрд░ рдореЗрдореЛрд░реА рд╕реЗрд╡рд┐рдВрдЧ рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рдЬреИрд╕рд╛ рдХрд┐ .NET рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрдкрдиреА рдкрд╕рдВрдж .NET рдХреЛ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╣реА рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдРрд╕рд╛ рдЕрдХреНрд╕рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдореИрдВ 4 рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдирд╣реАрдВ рдЖрддрд╛, рдареАрдХ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ , , .
рдирд┐рд╖реНрдХрд░реНрд╖
.NET , , . , . , . рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдорджрджрдЧрд╛рд░ рд░рд╣рд╛ рд╣реИред