C#,归并排序算法(Merge Sort Algorithm)的源代码及数据可视化

归并排序

归并算法采用非常经典的分治策略,每次把序列分成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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/295892.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx下日志配置和排查错误

目录 一&#xff1a;配置 二&#xff1a;排查日志 一&#xff1a;配置 在Nginx中&#xff0c;日志配置是记录服务器活动和排查问题的重要环节。以下是一些常见的Nginx日志配置选项&#xff1a; 日志级别&#xff1a;通过设置日志级别&#xff0c;可以控制日志的详细程度。常…

Java学习笔记(四)——正则表达式

文章目录 正则表达式基本规则字符类(只匹配一个字符)预定义字符(只匹配一个字符)数量词练习正则表达式插件 爬虫利用正则表达式获取想要的内容爬取网络信息练习有条件的爬取贪婪爬取非贪婪爬取正则表达式在字符串中的使用 分组捕获分组正则表达式外部使用非捕获分组正则表达式忽…

fmincon函数求解非线性超越方程的学习记录

最近的算法中用到了fmincon函数&#xff0c;寻找多变量非线性方程最小值的函数&#xff1b;因此学习一下&#xff1b; fmincon函数的基础语法如下所示&#xff1a; fmincon函数是为了求解下列方程的最小值&#xff1b; b 和 beq 是向量&#xff0c;A 和 Aeq 是矩阵&#xff0c…

CentOS 7.6下的HTTP隧道代理配置详解

在CentOS 7.6操作系统中&#xff0c;配置HTTP隧道代理需要一定的技术知识和经验。下面我们将详细介绍如何配置HTTP隧道代理&#xff0c;以确保网络通信的安全性和稳定性。 首先&#xff0c;我们需要了解HTTP隧道代理的基本原理。HTTP隧道代理是一种通过HTTP协议传输其他协议数…

STM32F103C8T6制作简易示波器

1设计需求 通过stm32f103c8t6实现一个简易示波器功能&#xff0c;该示波器可以检测0-3.6khz频率范围内的波形。 也可以输出波形&#xff0c;输出方波、三角波、正弦波。 2技术方案 通过stm32的ADC功能&#xff0c;采集输入信号&#xff0c;最后由oled屏进行显示。 采样频率…

test mutation-00-变异测试概览

拓展阅读 test 系统学习-04-test converate 测试覆盖率 jacoco 原理介绍 test 系统学习-05-test jacoco 测试覆盖率与 idea 插件 test 系统学习-06-test jacoco SonarQube Docker learn-29-docker 安装 sonarQube with mysql Ubuntu Sonar 突变测试是什么&#xff1f; …

Harbor配置同步规则删除不掉

【问题原因】 harbor上主从两个仓库&#xff0c;配置同步规则时&#xff0c;定时任务配置太频繁&#xff0c;导致规则修改&#xff0c;删除都失败。 【问题现象】 点击修改后保存&#xff0c;页面报internal server error的错。 【问题排查】 docker ps | grep harbor 查看…

格密码基础:对偶格(超全面)

目录 一. 对偶格的格点 1.1 基本定义 1.2 对偶格的例子 1.3 对偶格的图形理解 二. 对偶格的格基 2.1 基本定义 2.2 对偶格的格基证明 三. 对偶格的行列式 3.1 满秩格 3.2 非满秩格 四. 重复对偶格 五. 对偶格的转移定理&#xff08;transference theorem&#xff…

HarmonyOS 开发基础(五)Button

HarmonyOS 开发基础&#xff08;五&#xff09;Button Entry Component struct Index {build() {Row() {Column() {// Button&#xff1a;ArkUI 的基础组件 按钮组件// label 参数&#xff1a;文字型按钮Button(我是按钮)// width&#xff1a;属性方法&#xff0c;设置组件的宽…

【论文阅读笔记】医学多模态新数据集-Large-scale Long-tailed Disease Diagnosis on Radiology Images

这是复旦大学2023.12.28开放出来的数据集和论文&#xff0c;感觉很宝藏&#xff0c;稍微将阅读过程记录一下。 Zheng Q, Zhao W, Wu C, et al. Large-scale Long-tailed Disease Diagnosis on Radiology Images[J]. arXiv preprint arXiv:2312.16151, 2023. 项目主页&#xf…

防火安全球阀,到2027年市场增长至68亿美元

防火安全球阀是一种在火灾、爆炸等危险环境下仍能正常使用的阀门。它被广泛用于石化、化工、船舶、电力等领域&#xff0c;以保障生产和人员安全。下面我们将从全球市场和中国市场两个方面对其发展趋势进行分析。全球市场分析&#xff1a; 从全球市场的角度来看&#xff0c;防火…

Springboot和Spring有什么区别

SpringBoot和Spring的关系 不是&#xff1a;从马车到汽车那种交通出行的颠覆&#xff0c;从燃油车到纯电动车那种能源利用的变革&#xff0c;从人工驾驶到AI智能那种驾驶方式的升级。总之&#xff0c;不是产品的升级换代&#xff0c;不是谁要替换谁。而是&#xff1a;汽车从手…

Qt/C++摄像头采集/二维码解析/同时采集多路/图片传输/分辨率帧率可调/自动重连

一、前言 本地摄像头的采集可以有多种方式&#xff0c;一般本地摄像头会通过USB的方式连接&#xff0c;在嵌入式上可能大部分是CMOS之类的软带的接口&#xff0c;这些都统称本地摄像头&#xff0c;和网络摄像头最大区别就是一个是通过网络来通信&#xff0c;一个是直接本地通信…

操作系统期末复习大题---经典进程的同步问题

目录 一、经典进程的同步问题 1. 利用记录型信号量解决生产者—消费者问题 执行流程&#xff1a; ”生产者-消费者”问题模型代码框架如下&#xff1a; 注意&#xff1a; 小结&#xff1a; 复习典型例题&#xff1a; 解答&#xff1a; 2. 利用AND信号量解决生产者——…

Leetcode2966. 划分数组并满足最大差限制

Every day a Leetcode 题目来源&#xff1a;2966. 划分数组并满足最大差限制 解法1&#xff1a;排序 将数组 nums 从小到大排序&#xff0c;每三个一组插入答案&#xff0c;如果有 nums[i 2] - nums[i] > k&#xff0c;则不满足要求&#xff0c;返回空数组。 代码&…

C++学习笔记(二十四):c++ this

this指针在c中较为常用。this是一个指向当前对象实例的指针&#xff0c;通过this指针&#xff0c;可以访问该类的成员函数。示例如下&#xff1a;this指针主要的使用场景是在类内部调用类外部的函数&#xff0c;该函数传递的参数是调用该函数的类对象&#xff0c;代码示例如下&…

【linux】更改infiniband卡在Debian系统的网络接口名

在Debian或任何其他基于Linux的系统中&#xff0c;网络接口的名称由udev系统管理。通过创建udev规则&#xff0c;可以修改网络接口名称。以下是更改InfiniBand卡接口名称的一般步骤&#xff1a; 1. 找到网络接口的属性&#xff0c;以编写匹配的udev规则 可以使用udevadm命令查…

Postman Newman 教程:轻松管理 API 自动化测试步骤

Postman 中的 Newman 是什么&#xff1f; Newman 是一个 CLI&#xff08;命令行界面&#xff09;工具&#xff0c;用于运行 Postman 中的集合&#xff08;Collection&#xff09;和环境&#xff08;Environment&#xff09;来进行自动化测试。它允许直接从命令行运行 Postman …

数字后端设计实现 | 数字后端PR工具Innovus中如何创建不同高度的row?

吾爱IC社区星球学员问题&#xff1a;Innovus后端实现时两种种不同高度的site能做在一个pr里面吗&#xff1f; 答案是可以的。 Innovus支持在同一个设计中中使用不同的row&#xff0c;但需要给各自子模块创建power domain。这里所说的不同高度的row&#xff0c;有两种情况。 1…
最新文章