コード例 #1
0
        public HoareSort(PictureBox pb)
        {
            _pictureBox = pb;
            Random rnd = new Random();

            _elements = new TheElement[DrawingUtils.MaxN];
            for (int i = 0; i < _elements.Length; ++i)
            {
                var tmp = rnd.Next(1, 100);
                _elements[i] = new TheElement(
                    DrawingUtils.ElemetPosition(i, tmp, pb.Height), tmp, pb);
            }
        }
コード例 #2
0
        private void SortRec(int left, int right)
        {
            TheElement.DrawRange(left, right, _pictureBox, DrawingUtils.PartitionColor);
            // определяем границы сортируемого отрезка
            int i = left;
            int j = right;
            int x = _elements[(left + right) / 2].Value;

            _elements[(left + right) / 2].BearingElement(); // элемент принимаем за опорный
            do
            {
                while (_elements[i].Value < x)   // ищем слева больший элемент
                {
                    _elements[i].ComparingElement();
                    ++i;
                }
                while (_elements[j].Value > x)   // а справа меньший
                {
                    _elements[j].ComparingElement();
                    --j;
                }
                if (i <= j)   // если таковые обнаружились, меняем местами
                {
                    Swap(i, j);
                    ++i;
                    --j;
                }
            } while (i < j);
            _elements[(left + right) / 2].DefaultElement();
            TheElement.DrawRange(left, right, _pictureBox, DrawingUtils.BackColor); // стираем границы

            if (left < j)
            {
                SortRec(left, j);
            }
            if (i < right)
            {
                SortRec(i, right);
            }
        }
コード例 #3
0
        public void SwapPositions(TheElement other)
        {
            var futureSeltDest  = Y;
            var futureOtherDest = other.Y;

            _pen.Color = DrawingUtils.ComparingColor;
            Draw(true);
            other._pen.Color = DrawingUtils.ComparingColor;
            other.Draw(true);

            _graphics.DrawRectangle(Pens.DeepSkyBlue, X, DrawingUtils.Radius, 1, Y - DrawingUtils.Radius);
            MoveToLine(DrawingUtils.Radius);

            _graphics.DrawRectangle(Pens.DeepSkyBlue, other.X, other.Y + DrawingUtils.Radius, 1, Math.Abs(other.Y + DrawingUtils.Radius - UnderLine));
            other.MoveToLine(UnderLine);

            var step = X < other.X ? 1 : -1;
            var diff = Math.Abs(X - other.X); // количество шагов между вершинами по горизонтали

            for (int i = 0; i < diff; ++i)
            {
                MoveX(step);
                other.MoveX(-step);
                Thread.Sleep(Speed - DrawingUtils.Speed);
            }
            //_graphics.DrawRectangle(Pens.OrangeRed, X, futureSeltDest + DrawingUtils.Radius, 1, UnderLine - futureSeltDest - DrawingUtils.Radius);
            //MoveToLine(DrawingUtils.Radius);
            //_graphics.DrawRectangle(Pens.OrangeRed, other.X, other.Y + DrawingUtils.Radius, 1, futureSeltDest - other.Y + DrawingUtils.Radius);
            //other.MoveToLine(UnderLine);
            MoveToLine(futureSeltDest);
            other.MoveToLine(futureOtherDest);

            _pen.Color = DrawingUtils.DefaultElemColor;
            Draw(true);
            other._pen.Color = DrawingUtils.DefaultElemColor;
            other.Draw(true);
        }