private static int QSortPartition(Deq <int> array, int lo, int hi) { var pivot = array[lo]; var i = lo - 1; var j = hi + 1; for (;;) { do { j--; } while (array[j] > pivot); do { i++; } while (array[i] < pivot); if (i < j) { var t = array[i]; array[i] = array[j]; array[j] = t; } else { return(j); } } }
public static Deq <int> Sort2(Deq <int> unsortedArray) { if (unsortedArray.Count > 1) { QSort(unsortedArray, 0, unsortedArray.Count - 1); } return(unsortedArray); }
private static void QSort(Deq <int> array, int lo, int hi) { if (lo < hi) { var p = QSortPartition(array, lo, hi); QSort(array, lo, p); QSort(array, p + 1, hi); } }
/// <summary> /// Создаём деку на рандом /// </summary> /// <returns>Deq<int></returns> private static Deq <int> RandomArray(int size) { var rnd = new Random(); var deq = new Deq <int>(); for (var i = 0; i < size; i++) { deq.PushBack(rnd.Next(0, 100)); } return(deq); }
/// <summary> /// Сортировать деку /// </summary> /// <param name="unsortedArray">Не отсортированная дека Deq<T></param> /// <returns>Отсортированная дека Deq<T></returns> public static Deq <int> Sort(Deq <int> unsortedArray) { for (int i = 0; i < unsortedArray.Count; i++) { Console.WriteLine("Выполнено " + i + " из " + unsortedArray.Count + "(" + (double)i / ( (double)unsortedArray.Count / 100) + "%)"); var current = unsortedArray[i]; var ins = BinarySearch(unsortedArray, 0, i, current); for (var j = i - 1; j >= ins; j--) { unsortedArray[j + 1] = unsortedArray[j]; } unsortedArray[ins] = current; } return(unsortedArray); }
/// <summary> /// Бинарный поиск подходящей позиции элемента в массиве /// </summary> /// <param name="array">Массив элементов</param> /// <param name="low">Нижняя граница</param> /// <param name="high">Верхняя граница</param> /// <param name="key">Что ищем</param> /// <returns>Позиция для вставки значения в деку</returns> private static int BinarySearch(Deq <int> array, int low, int high, int key) { if (low == high) { return(low); } var mid = low + ((high - low) / 2); var current = array[mid]; if (key > current) { return(BinarySearch(array, mid + 1, high, key)); } else if (key < current) { return(BinarySearch(array, low, mid, key)); } return(mid); }