.net多线程归并排序
一.概述
在了解排序算法的同时,想到用多线程排序减少排序的时间,所以写了一个简单的示例,加深印象。下面是具体代码
二.内容
环境:vs2017,.net core 2.2 控制台程序。
运行时使用release会减少运行时间,因为debug时调试模式,vs会进行检测。

详细代码:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading; namespace coreCW
{
class Program
{
static void Main(string[] args)
{ Random rd = new Random();
int[] arr = new int[]; //随机生成数组
for (long i = ; i < arr.Length; i++)
{
arr[i] = rd.Next(, );
} //线程数组
List<Thread> tList = new List<Thread>(); //计时器
Stopwatch sw = new Stopwatch();
sw.Reset();
sw.Start(); int tmun =; //线程数
//循环开启线程进行分段排序,并加入线程列表
for (int i = ; i < tmun; i++)
{
int size = arr.Length / tmun;
Thread t = new Thread((object obj) =>
{
int index = Convert.ToInt32(obj);
Merge_Sort(arr, size * index, size * (index + ) - );
});
tList.Add(t);
t.Start(i);
} //join主线程等待所有线程完成后,继续向下运行
for (int i = ; i < tList.Count; i++)
{
Thread t = tList[i];
t.Join();
} //合并数组
for (int i = ; i < tmun; i++)
{
int size = arr.Length / tmun;
Merge(arr, , size * i - , size* (i + ) - );
} sw.Stop();
Console.WriteLine("排序总共花费{0}ms.", sw.Elapsed.TotalMilliseconds);
Console.WriteLine("Thread Finished!");
Console.WriteLine("===================");
//foreach (var item in arr)
//{
// Console.WriteLine(item);
//}
} //归并排序
public static void Merge_Sort(int[] arr, int left, int right)
{ if (left < right)
{
int middle = (left + right) / ;
Merge_Sort(arr, left, middle);
Merge_Sort(arr, middle + , right);
Merge(arr, left, middle, right);
}
} /// <summary>
/// 归并排序合并
/// 将有序的两个序列分别加两个数组,从数组顶端取两个进行比较,取其小的放入原数组,直至两数组的元素取完
/// </summary>
/// <param name="arr"></param>
/// <param name="left"></param>
/// <param name="middle"></param>
/// <param name="right"></param>
public static void Merge(int[] arr, int left, int middle, int right)
{
int i = middle - left + ;
int j = right - middle; //新建两个数组将两部分元素赋予其中
int[] arrLeft = new int[i];
int[] arrRight = new int[j];
for (int k = ; k < i; k++)
{
arrLeft[k] = arr[left + k];
} for (int k = ; k < j; k++)
{
arrRight[k] = arr[middle + k + ];
} //分别从两个数组中取值
int m = , n = ;
for (int l = ; l < right - left + ; l++)
{
if (m >= arrRight.Length)
{
arr[left + l] = arrLeft[n];
n++;
}
else if (n >= arrLeft.Length)
{
arr[left + l] = arrRight[m];
m++;
}
else if ((arrLeft[n] > arrRight[m]))
{
arr[left + l] = arrLeft[n];
n++;
}
else
{
arr[left + l] = arrRight[m];
m++;
}
}
}
}
}
三.总结
多线程排序在一定程度上会减少代码运行时间,但并不是开启的线程越多速度就越快,当线程开启到一定数量就会达到瓶颈(线程数需要根据机器性能和具体测试结果来决定以及时间复杂度计算公式得出),或者反而降低速度。单线程的归并排序是一个线程递归所有子数组排序。多线程是将数组分为若干部分,将其交给各个线程并行排序,待所有线程工作完毕后对所有数组进行合并,所以多线程排序加快了子数组的排序过程,虽然最后多线程需要合并,但是在使用单线程的时候也会经历类似的合并过程,所以多线程排序并未增加额外的合并次数,(计算时间复杂度可以记录代码每一步的时间复杂度相加可以得出一个问题规模与时间复杂度的公式),另外可以对排序算法进行更换或优化,比如归并排序在数量比较小的情况速度会比选择排序要慢一点,所以可以优化归并排序,使其在比较小的数量级上使用选择排序或插入排序。
多线成排序和多线程搜索在实际工作中也是比较常用的.
.net多线程归并排序的更多相关文章
- 多线程归并排序的实现 java
多线程是非常适合归并排序的,因为归并排序是分治法,所以分割后可以独立运行,最后将结果归并起来就行了.如何写一个多线程程序呢?今天无聊,总结一下啊. 首先写个普通的归并排序,以后的多线程就调用这个排序. ...
- 归并排序 求逆序数 链表的归并排序 多线程归并排序 java
import java.util.Scanner; public class Main { private static int count=0; public static void mergeso ...
- 多线程归并排序(摘自githhub)
package com.rationalcoding.sort; import java.util.ArrayList; import java.util.Arrays; import java.ut ...
- pthread 多线程基础
本文主要介绍如何通过 pthread 库进行多线程编程,并通过以下例子进行说明. 基于莱布尼兹级数计算 \(\pi\) . 多线程归并排序 参考文章: [1] https://computing.ll ...
- 秋招落幕,对自己的总结by2018-10-20
在今天阿里沟通offer完毕,正式三方也确定了,一切如梦,想想1月的自己还担心未来的自己会花落谁家,到10月的今天,一切尘埃落地.一直不怎么喜欢总结自己的历程,今天无聊的我也总结一波吧. 准确的说没有 ...
- java归并排序,单线程vs多线程
一.什么是归并排序 归并排序又称合并排序,它是成功应用分治技术的一个完美例子.对于一个需要排序的数组A[0..n-1],归并排序把它一分为二:A[0..n/2-1]和A[n/2..n-1],并对每个子 ...
- 关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- Linux多线程实践(10) --使用 C++11 编写 Linux 多线程程序
在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从 ...
- 使用C++编写linux多线程程序
前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...
随机推荐
- 别人家的 InfluxDB 实战 + 源码剖析
1. 前几次的分享,我们多次提到了下图中 Metrics 指标监控的 Prometheus.Grafana,而且 get 到了 influxdata 旗下的 InfluxDB 的入门技能. 本次,我们 ...
- DOM--选取文档元素
大多数的客户端JavaScript程序在运行时都是在操作一个或者多个文档元素,而为了操作文档中的元素我们就必须要通过某种途径或者方法获得或者选取这些引用文档元素的Element对象.DOM定义了许多种 ...
- vagrant 入门案例 - 快速创建 Centos7
中文文档:http://tangbaoping.github.io/vagrant_doc_zh/v2/ 参考: https://blog.csdn.net/yjk13703623757/articl ...
- git使用基本步骤
一.Git配置环境: 1.通过git init命令把某个目录变成Git可以管理的仓库: 2.生成公钥秘钥:ssh key ssh-keygen -t rsa -C "for example@ ...
- java仿win7计算器布局
代码: package calculator; import javax.swing.*; import java.awt.*; import java.awt.event.*; public cla ...
- 会 Linux 用户管理的不一定是网管吧
管理用户文件 用户账户文件 /etc/passwd账户号文件 在Linux系统中,创建的用户账户及其相关信息,均放在/etc/passwd配置文件中. 这个文件中每一行代表一个用户的资料. 每一行使用 ...
- template_homepage
homepage用到的方法 使用 {% for ... in ...%} 加 {% endfor %} 实现循环结构 举例: {% for post in posts %} <p style ...
- spark sql createOrReplaceTempView registerTempTable
createOrReplaceTempView2.x版本以上. registerTempTable1.5.x val data1 = dataSelect1(sqlContext, sparkMode ...
- not found 什么时候触发
eq: BEGIN DECLARE EXIT HANDLER FOR NOT FOUND SET o_state = 999; select count(1) into ...
- Tomcat5启动流程与配置详解
标签:配置 tomcat 休闲 职场 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto. ...