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); } }
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); } }
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); }