Advertisement
Guest User

Untitled

a guest
Aug 27th, 2017
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.46 KB | None | 0 0
  1. using System;
  2.  
  3. namespace Exercise2
  4. {
  5.     class QuickSort
  6.     {
  7.         public static void Sort<T>(T[] arr)
  8.             where T : IComparable
  9.         {
  10.             SortingAlgorithms.FisherYates(arr);
  11.             Sort(arr, 0, arr.Length - 1);
  12.         }
  13.  
  14.         private static void Sort<T>(T[] arr, int leftIndex, int rightIndex)
  15.             where T : IComparable
  16.         {
  17.             if (leftIndex >= rightIndex)
  18.                 return;
  19.  
  20.             if (rightIndex - leftIndex < 7)
  21.             {
  22.                 SortingAlgorithms.InsertionSort(arr, leftIndex, rightIndex + 1);
  23.                 return;
  24.             }
  25.  
  26.             int leftCounter = leftIndex;
  27.             int rightCounter = rightIndex + 1;
  28.             int sameElementsLeft = leftIndex;
  29.             int sameElementRight = rightIndex + 1;
  30.             T item = arr[leftIndex];
  31.  
  32.             while (true)
  33.             {
  34.                 while (item.CompareTo(arr[++leftCounter]) > 0)
  35.                 {
  36.                     if (leftCounter == rightIndex)
  37.                         break;
  38.                 }
  39.  
  40.                 while (item.CompareTo(arr[--rightCounter]) < 0)
  41.                 {
  42.                     if (rightCounter == leftIndex)
  43.                         break;
  44.                 }
  45.  
  46.                 if (leftCounter >= rightCounter)
  47.                     break;
  48.  
  49.                 Swap(ref arr[leftCounter], ref arr[rightCounter]);
  50.  
  51.                 if (item.CompareTo(arr[leftCounter]) == 0)
  52.                     Swap(ref arr[leftCounter], ref arr[++sameElementsLeft]);
  53.  
  54.                 if (item.CompareTo(arr[rightCounter]) == 0)
  55.                     Swap(ref arr[rightCounter], ref arr[--sameElementRight]);
  56.             }
  57.  
  58.             Swap(ref arr[leftIndex], ref arr[rightCounter]);
  59.  
  60.             rightCounter--;
  61.  
  62.             for (int cnt = leftIndex; cnt < sameElementsLeft; cnt++)
  63.             {
  64.                 Swap(ref arr[cnt], ref arr[rightCounter]);
  65.                 rightCounter--;
  66.             }
  67.  
  68.             for (int cnt = rightIndex - 1; cnt > sameElementRight; cnt--)
  69.             {
  70.                 Swap(ref arr[cnt], ref arr[leftCounter]);
  71.                 leftCounter++;
  72.             }
  73.  
  74.             Sort(arr, leftIndex, rightCounter);
  75.             Sort(arr, leftCounter, rightIndex);
  76.         }
  77.  
  78.         public static void Swap<T>(ref T first, ref T second)
  79.         {
  80.             T temp = first;
  81.             first = second;
  82.             second = temp;
  83.         }
  84.     }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement