예제 #1
0
파일: Program.cs 프로젝트: iarestov/DeqOpt
        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);
                }
            }
        }
예제 #2
0
파일: Program.cs 프로젝트: iarestov/DeqOpt
 public static Deq <int> Sort2(Deq <int> unsortedArray)
 {
     if (unsortedArray.Count > 1)
     {
         QSort(unsortedArray, 0, unsortedArray.Count - 1);
     }
     return(unsortedArray);
 }
예제 #3
0
파일: Program.cs 프로젝트: iarestov/DeqOpt
 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);
     }
 }
예제 #4
0
파일: Program.cs 프로젝트: iarestov/DeqOpt
        /// <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);
        }
예제 #5
0
파일: Program.cs 프로젝트: iarestov/DeqOpt
        /// <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);
        }
예제 #6
0
파일: Program.cs 프로젝트: iarestov/DeqOpt
        /// <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);
        }