2.1.17 #
解答 #
选择排序:
插入排序:
代码 #
使用一个 timer 按一定时间重绘数组,排序算法里面一次循环后等待一段时间再进行下一次循环。(这并不是一个很好的方法,但对于演示来说足够了)
这里排序算法是另开线程运行的,防止 Sleep 的时候让程序无响应。
选择排序:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
namespace _2._1._17
{
public partial class Form2 : Form
{
double[] randomDoubles;
public Form2(int N)
{
InitializeComponent();
this.randomDoubles = new double[N];
Random random = new Random();
for (int i = 0; i < N; i++)
{
this.randomDoubles[i] = random.NextDouble() * 0.8 + 0.2;
}
drawPanel();
this.timer1.Interval = 60;
this.timer1.Start();
Thread thread = new Thread(new ThreadStart(this.SelectionSort));
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// 选择排序。
/// </summary>
private void SelectionSort()
{
for (int i = 0; i < this.randomDoubles.Length; i++)
{
int min = i;
for (int j = i; j < this.randomDoubles.Length; j++)
{
if (this.randomDoubles[min] > this.randomDoubles[j])
{
min = j;
}
}
double temp = this.randomDoubles[i];
this.randomDoubles[i] = this.randomDoubles[min];
this.randomDoubles[min] = temp;
Thread.Sleep(1000);
}
}
/// <summary>
/// 在屏幕上用柱形图绘制数组。
/// </summary>
private void drawPanel()
{
Graphics graphics = this.CreateGraphics();
graphics.Clear(this.BackColor);
graphics.TranslateTransform(0, this.Height);
graphics.ScaleTransform(1, -1);
Rectangle clientRect = this.ClientRectangle;
Rectangle drawRect = new Rectangle(clientRect.X + 10, clientRect.Y + 10, clientRect.Width - 10, clientRect.Height - 10);
PointF[] barX = new PointF[this.randomDoubles.Length];
float unitX = (float)drawRect.Width / this.randomDoubles.Length;
unitX -= 4;
barX[0] = new PointF(4, drawRect.Top);
for (int i = 1; i < this.randomDoubles.Length; i++)
{
barX[i] = new PointF(2 + unitX + barX[i - 1].X, drawRect.Top);
}
RectangleF[] bars = new RectangleF[this.randomDoubles.Length];
for (int i = 0; i < this.randomDoubles.Length; i++)
{
SizeF size = new SizeF(unitX, (float)this.randomDoubles[i] * drawRect.Height);
bars[i] = new RectangleF(barX[i], size);
}
graphics.FillRectangles(Brushes.Black, bars);
graphics.Dispose();
}
private void timer1_Tick(object sender, EventArgs e)
{
drawPanel();
}
}
}
插入排序:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
namespace _2._1._17
{
public partial class Form3 : Form
{
double[] randomDoubles;
public Form3(int N)
{
InitializeComponent();
this.randomDoubles = new double[N];
Random random = new Random();
for (int i = 0; i < N; i++)
{
this.randomDoubles[i] = random.NextDouble() * 0.8 + 0.2;
}
drawPanel();
this.timer1.Interval = 60;
this.timer1.Start();
Thread thread = new Thread(new ThreadStart(this.InsertionSort));
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// 插入排序。
/// </summary>
private void InsertionSort()
{
for (int i = 0; i < this.randomDoubles.Length; i++)
{
for (int j = i; j > 0 && this.randomDoubles[j] < this.randomDoubles[j - 1]; j--)
{
double temp = this.randomDoubles[j];
this.randomDoubles[j] = this.randomDoubles[j - 1];
this.randomDoubles[j - 1] = temp;
Thread.Sleep(500);
}
}
}
/// <summary>
/// 在屏幕上用柱形图绘制数组。
/// </summary>
private void drawPanel()
{
Graphics graphics = this.CreateGraphics();
graphics.Clear(this.BackColor);
graphics.TranslateTransform(0, this.Height);
graphics.ScaleTransform(1, -1);
Rectangle clientRect = this.ClientRectangle;
Rectangle drawRect = new Rectangle(clientRect.X + 10, clientRect.Y + 10, clientRect.Width - 10, clientRect.Height - 10);
PointF[] barX = new PointF[this.randomDoubles.Length];
float unitX = (float)drawRect.Width / this.randomDoubles.Length;
unitX -= 4;
barX[0] = new PointF(4, drawRect.Top);
for (int i = 1; i < this.randomDoubles.Length; i++)
{
barX[i] = new PointF(2 + unitX + barX[i - 1].X, drawRect.Top);
}
RectangleF[] bars = new RectangleF[this.randomDoubles.Length];
for (int i = 0; i < this.randomDoubles.Length; i++)
{
SizeF size = new SizeF(unitX, (float)this.randomDoubles[i] * drawRect.Height);
bars[i] = new RectangleF(barX[i], size);
}
graphics.FillRectangles(Brushes.Black, bars);
graphics.Dispose();
}
private void timer1_Tick(object sender, EventArgs e)
{
drawPanel();
}
}
}