归并排序
归并算法采用非常经典的分治策略,每次把序列分成n/2的长度,将问题分解成小问题,由复杂变简单。
因为使用了递归算法,不能用于大数据的排序。
核心代码:
using System;
using System.Text;
using System.Collections.Generic;
using System.Windows.Forms;
namespace WindowsFormsApp6
{
public partial class Form1 : Form
{
Random rnd = new Random((int)DateTime.Now.Ticks);
List<string> slides = new List<string>();
public Form1()
{
InitializeComponent();
BrowserReleaseHelper.SetWebBrowserFeatures(11);
}
private void Form1_Load(object sender, EventArgs e)
{
this.Text = "C#,四种常见排序算法的可视化编程——北京联高软件开发有限公司";
button1.Text = "选择排序"; button1.Cursor = Cursors.Hand;
button2.Text = "冒泡排序"; button2.Cursor = Cursors.Hand;
button3.Text = "插入排序"; button3.Cursor = Cursors.Hand;
button4.Text = "快速(递归)"; button4.Cursor = Cursors.Hand;
button5.Text = "快速(非递归)"; button5.Cursor = Cursors.Hand;
button6.Text = "归并排序"; button6.Cursor = Cursors.Hand;
panel1.Dock = DockStyle.Top;
panel2.Dock = DockStyle.Fill;
webBrowser1.Navigate("http://www.315soft.com");
}
private int[] RandArray()
{
int n = 20;
int[] dataArray = new int[n];
for (int i = 0; i < n; i++)
{
dataArray[i] = rnd.Next(20, 100);
}
return dataArray;
}
private void button6_Click(object sender, EventArgs e)
{
int[] arraySource = RandArray();
int[] arrayTemplate = new int[arraySource.Length];
MergeSort(0, arraySource.Length - 1, ref arraySource, ref arrayTemplate);
loop = 0;
timer1.Interval = 100;
timer1.Enabled = true;
}
/// <summary>
/// 归并排序算法
/// </summary>
/// <param name="left"></param>
/// <param name="right"></param>
/// <param name="arraySource"></param>
/// <param name="arrayTemplate"></param>
private void MergeSort(int left, int right, ref int[] arraySource, ref int[] arrayTemplate)
{
if (left >= right)
{
return;
}
int mid = (left + right) >> 1;
MergeSort(left, mid, ref arraySource, ref arrayTemplate);
MergeSort(mid + 1, right, ref arraySource, ref arrayTemplate);
int head_left = left;
int head_right = mid + 1;
int tmp_index = left;
while (head_left <= mid && head_right <= right)
{
if (arraySource[head_left] < arraySource[head_right])
{
arrayTemplate[tmp_index++] = arraySource[head_left++];
}
else
{
arrayTemplate[tmp_index++] = arraySource[head_right++];
}
}
while (head_left <= mid)
{
arrayTemplate[tmp_index++] = arraySource[head_left++];
}
while (head_right <= right)
{
arrayTemplate[tmp_index++] = arraySource[head_right++];
}
for (int i = left; i <= right; i++)
{
arraySource[i] = arrayTemplate[i];
}
slides.Add(Slide(button6.Text, arraySource, left, right));
}
private string Slide(string title, int[] dataArray, int a, int b)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
sb.AppendLine("<html xmlns=\"http://www.w3.org/1999/xhtml\" >");
sb.AppendLine("<head>");
sb.AppendLine("<style>");
sb.AppendLine("td { vertical-align:bottom;text-align:center;font-size:12px; } ");
sb.AppendLine(".bar { width:" + (int)((webBrowser1.Width - dataArray.Length * 11) / dataArray.Length) + "px;font-size:12px;border:solid 1px #FF6701;background-color:#F08080;text-align:center;border-radius:3px; }");
sb.AppendLine("</style>");
sb.AppendLine("</head>");
sb.AppendLine("<body>");
sb.AppendLine("<table width='100%' style='border-bottom:solid 1px #E9E9E0;'>");
sb.AppendLine("<tr>");
sb.AppendLine("<td>方法:" + title + "</td>");
sb.AppendLine("<td>数据:" + dataArray.Length + "</td>");
sb.AppendLine("<td>步骤:[0]</td>");
sb.AppendLine("</tr>");
sb.AppendLine("</table>");
sb.AppendLine("<br>");
sb.AppendLine("<table width='100%' style='border-bottom:solid 15px #E9E9E0;'>");
sb.AppendLine("<tr>");
for (int i = 0; i < dataArray.Length; i++)
{
if (i == a || i == b)
{
sb.AppendLine("<td>" + dataArray[i] + "<div class='bar' style='height:" + dataArray[i] * 3 + "px;background-color:#993333;'></div></td>");
}
else
{
sb.AppendLine("<td>" + dataArray[i] + "<div class='bar' style='height:" + dataArray[i] * 3 + "px;'></div></td>");
}
}
sb.AppendLine("</tr>");
sb.AppendLine("</table>");
sb.AppendLine("</body>");
sb.AppendLine("</html>");
return sb.ToString();
}
int loop = 0;
private void timer1_Tick(object sender, EventArgs e)
{
if (loop < slides.Count + (3000 / timer1.Interval))
{
if (loop < slides.Count)
{
webBrowser1.DocumentText = slides[loop].Replace("[0]", loop + " / " + slides.Count);
loop++;
return;
}
loop++;
return;
}
loop = 0;
}
}
}
——————————————————————
POWER BY 315SOFT.COM &
TRUFFER.CN