.NET рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд░реЗрдВ

рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдп рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ - .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЫрдВрдЯрдиреА рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ .NET рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрд░рд┐рдпрд░реНрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдлреАрдЪрд░реНрд╕, рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝реА рддреБрд▓рдирд╛ рднреА рдХрд░рддреЗ рд╣реИрдВред

рддреЛ, рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, .NET рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд╡рд░рд┐рдд рд╕реЙрд░реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░:

рд▓рд╛рдн:
  1. рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд▓реЗ рдЖрдВрддрд░рд┐рдХ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ (рдЕрднреНрдпрд╛рд╕ рдореЗрдВ);
  2. рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди;
  3. рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ O (logn) рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ, O (n) рдореЗрдореЛрд░реА);
  4. рдпрд╣ рдХреИрд╢рд┐рдВрдЧ рдФрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдиреБрдХрд╕рд╛рди:
  1. рдпрд╣ рд╕рд╣рд╛рдпрдХ рддрддреНрд╡реЛрдВ рдХреЗ рдЕрд╕рдлрд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде O (n 2 ) рдХреА рдЧрддрд┐ рдореЗрдВ рдмрд╣реБрдд рдЧрд┐рд░рд╛рд╡рдЯ рд▓рд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрд╕рдлрд▓ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╕рдорд░реНрдерди рддрддреНрд╡ рдЪреБрдирдХрд░ рдЗрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рди рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ;
  2. рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдПрдХ рднреЛрд▓реЗ-рднрд╛рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ O (n) рдиреЗрд╕реНрдЯреЗрдб рд░рд┐рд░реНрд╕рд┐рд╡ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдмреЗрд╣рддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗрд╡рд▓ рд╕рд░рдгреА рдХреЗ рджреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдЫреЛрдЯреЗ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ O (logn) рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ;
  3. рдЕрд╕реНрдерд┐рд░ - рдпрджрд┐ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреБрдВрдЬреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдПрдХ рддреНрд╡рд░рд┐рдд рд╕реЙрд░реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рднреЛрд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:

Naive QuickSort
public 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); } 


рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
  1. рдЪреВрдВрдХрд┐ рд╕рдорд░реНрдерди рддрддреНрд╡ рдХреЛ рд╕рд░рдгреА рдХреЗ рдордзреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЕрдзрд┐рдХрддрдо рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рд░рдгреА рдХреЛ рд▓рдВрдмрд╛рдИ n - 1 рдФрд░ 1 рдХреЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЧрддрд┐ O (n 2 ) рддрдХ рдиреАрдЪрд╛ рд╣реЛ рдЬрд╛рдПрдЧреА;
  2. рдЙрдкрд░реЛрдХреНрдд рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдУ (рдПрди) рддрдХ рдкрд╣реБрдВрдЪрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмрдбрд╝реЗ рдПрди рдХреЗ рд▓рд┐рдП, рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ;
  3. рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рд╕рдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рддрддреНрд╡реЛрдВ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдирдВрдмрд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░, рдпрд╣ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рднреА рд╕рдВрдкрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЙрд░реНрдЯ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХрдИ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдРрд╕реЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдорд┐рд▓реЗрдЧреА, рдЬрд┐рдирдХрд╛ рдХреНрд░рдо рдЕрд▓рдЧ рд╣реИред

рд╣рдо .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) //           if (keys->GetRank() != 1 || keys->GetLowerBoundsPtr()[0] != 0) return FALSE; //     TypeHandle keysTH = keys->GetElementTypeHandle(); //       const CorElementType keysElType = keysTH.GetSigCorElementType(); if (!CorTypeInfo::IsPrimitiveType(keysElType)) return FALSE; if (items != NULL) { TypeHandle itemsTH = items->GetElementTypeHandle(); if (keysTH != itemsTH) return FALSE; // Can't currently handle sorting different types of arrays. } //       if (left == right || right == 0xffffffff) return TRUE; //        ++. switch(keysElType) { case ELEMENT_TYPE_I1: // 1-    (sbyte) ArrayHelpers<I1>::QuickSort((I1*) keys->GetDataPtr(), (I1*) (items == NULL ? NULL : items->GetDataPtr()), left, right); break; case ELEMENT_TYPE_U1: // 1-     (byte) case ELEMENT_TYPE_BOOLEAN: //   (bool) ArrayHelpers<U1>::QuickSort((U1*) keys->GetDataPtr(), (U1*) (items == NULL ? NULL : items->GetDataPtr()), left, right); break; case ELEMENT_TYPE_I2: // 2-    (short) ArrayHelpers<I2>::QuickSort((I2*) keys->GetDataPtr(), (I2*) (items == NULL ? NULL : items->GetDataPtr()), left, right); break; case ELEMENT_TYPE_U2: // 2-     (ushort) case ELEMENT_TYPE_CHAR: //   (char) ArrayHelpers<U2>::QuickSort((U2*) keys->GetDataPtr(), (U2*) (items == NULL ? NULL : items->GetDataPtr()), left, right); break; case ELEMENT_TYPE_I4: // 4-    (int) ArrayHelpers<I4>::QuickSort((I4*) keys->GetDataPtr(), (I4*) (items == NULL ? NULL : items->GetDataPtr()), left, right); break; case ELEMENT_TYPE_U4: // 4-     (uint) ArrayHelpers<U4>::QuickSort((U4*) keys->GetDataPtr(), (U4*) (items == NULL ? NULL : items->GetDataPtr()), left, right); break; case ELEMENT_TYPE_R4: // 4-     (float) ArrayHelpers<R4>::QuickSort((R4*) keys->GetDataPtr(), (R4*) (items == NULL ? NULL : items->GetDataPtr()), left, right); break; case ELEMENT_TYPE_I8: // 8-    (long) ArrayHelpers<I8>::QuickSort((I8*) keys->GetDataPtr(), (I8*) (items == NULL ? NULL : items->GetDataPtr()), left, right); break; case ELEMENT_TYPE_U8: // 8-     (ulong) ArrayHelpers<U8>::QuickSort((U8*) keys->GetDataPtr(), (U8*) (items == NULL ? NULL : items->GetDataPtr()), left, right); break; case ELEMENT_TYPE_R8: // 8-     (double) ArrayHelpers<R8>::QuickSort((R8*) keys->GetDataPtr(), (R8*) (items == NULL ? NULL : items->GetDataPtr()), left, right); break; case ELEMENT_TYPE_I: //       (IntPtr) case ELEMENT_TYPE_U: //         (UIntPtr) // In V1.0, IntPtr & UIntPtr are not fully supported types. They do // not implement IComparable, so searching & sorting for them should // fail. In V1.1 or V2.0, this should change. return FALSE; default: return FALSE; } return TRUE; } 


рдиреЗрдЯрд┐рд╡ рдХреНрд╡рд┐рдХреЙрд░реНрдЯ
 // -    template <class KIND> class ArrayHelpers { static void QuickSort(KIND keys[], KIND items[], int left, int right) { do { int i = left; int j = right; KIND x = keys[(i + j) >> 1]; do { while (Compare(keys[i], x) < 0) i++; while (Compare(x, keys[j]) < 0) j--; if (i > j) break; if (i < j) { KIND key = keys[i]; keys[i] = keys[j]; keys[j] = key; if (items != NULL) { KIND item = items[i]; items[i] = items[j]; items[j] = item; } } i++; j--; } while (i <= j); if (j - left <= right - i) { if (left < j) QuickSort(keys, items, left, j); left = i; } else { if (i < right) QuickSort(keys, items, i, right); right = j; } } while (left < 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) { // TrySZSort      . //        Int32.CompareTo    "<"  ">". if (length <= 1 || (comparer == null || comparer == Comparer<T>.Default) && Array.TrySZSort((Array) array, (Array) null, index, index + length - 1)) return; ArraySortHelper<T>.Default.Sort(array, index, length, 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); // 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]; 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдм рдордзреНрдп рдХреА рдЧрдгрдирд╛ рд╕реВрддреНрд░ 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) //   16    { if (num == 1) //   break; if (num == 2) //   { ArraySortHelper<T>.SwapIfGreater(keys, comparer, lo, hi); break; } else if (num == 3) //   { ArraySortHelper<T>.SwapIfGreater(keys, comparer, lo, hi - 1); ArraySortHelper<T>.SwapIfGreater(keys, comparer, lo, hi); ArraySortHelper<T>.SwapIfGreater(keys, comparer, hi - 1, hi); break; } else { ArraySortHelper<T>.InsertionSort(keys, lo, hi, comparer); //  break; } } else if (depthLimit == 0) //    { ArraySortHelper<T>.Heapsort(keys, lo, hi, comparer); //   break; } else //      { --depthLimit; num = ArraySortHelper<T>.PickPivotAndPartition(keys, lo, hi, comparer); ArraySortHelper<T>.IntroSort(keys, num + 1, hi, depthLimit, comparer); } } } 


PickPivotAndPartition
 //     private static int PickPivotAndPartition(T[] keys, int lo, int hi, IComparer<T> comparer) { int index = lo + (hi - lo) / 2; ArraySortHelper<T>.SwapIfGreater(keys, comparer, lo, index); ArraySortHelper<T>.SwapIfGreater(keys, comparer, lo, hi); ArraySortHelper<T>.SwapIfGreater(keys, comparer, index, hi); T obj = keys[index]; ArraySortHelper<T>.Swap(keys, index, hi - 1); int i = lo; int j = hi - 1; while (i < j) { do ; while (comparer.Compare(keys[++i], obj) < 0); do ; while (comparer.Compare(obj, keys[--j]) < 0); if (i < j) ArraySortHelper<T>.Swap(keys, i, j); else break; } ArraySortHelper<T>.Swap(keys, i, hi - 1); return i; } 


InsertionSort
 //  private static void InsertionSort(T[] keys, int lo, int hi, IComparer<T> comparer) { for (int index1 = lo; index1 < hi; ++index1) { int index2 = index1; T x; for (x = keys[index1 + 1]; index2 >= lo && comparer.Compare(x, keys[index2]) < 0; --index2) keys[index2 + 1] = keys[index2]; keys[index2 + 1] = x; } } 


рдЕрдм рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдЫрдВрдЯрд╛рдИ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реИ: рд╕рдореНрдорд┐рд▓рди рдЫрдБрдЯрд╛рдИ, рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдФрд░ рдкрд┐рд░рд╛рдорд┐рдб рдЫрдБрдЯрд╛рдИред

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 , , . , . , . рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдорджрджрдЧрд╛рд░ рд░рд╣рд╛ рд╣реИред

Source: https://habr.com/ru/post/In188012/


All Articles