.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 浏览器应用程 ...
随机推荐
- 关于C#三层架构增删改查中的“添加”问题
关于“添加”功能的实现比较简单: 先来一个简单的界面: 然后是代码: ··采用的是三层架构的思想写的·· 在DAO中的方法为: (使用了动软自动生成代码) 希望对您有所帮助!
- Spring Boot 完整讲解
SpringBoot学习笔记 文章写得比较详细,所以很长(105336 字数),可以参考目录 文章目录 SpringBoot学习笔记 @[toc] 一. Spring Boot 入门 预:必须掌握的技 ...
- 如何将MagicaVoxel模型导入UE4中(2)
前言 当可以把MagicaVoxel的静态模型导入到UE4后,我又开始不满足了.默认第三人称蓝图的"汽车碰撞人偶(雾)"与场景中的体素画风格格不入,于是,我便想着用自己建造的体素画 ...
- PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分)
PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分) 7-41 PAT排名汇总 (25 分) 计算机程序设计能力考试(Programming Ability Test,简称P ...
- Netty 中的 handler 和 ChannelPipeline 分析
上一节我们讲了 Netty 的启动流程,从启动流程入手分析了 Reactor 模型的第一步:channel 如何绑定 Selector.然后讲到了 EventLoop 在启动的时候发挥了什么作用.整个 ...
- 关于selenium定位元素时,出现此问题的处理办法:find_element=wait.until(ec.presence_of_element_locatetd(locator))定位不到页面元素的问题
最近再用,selenium中的from selenium.webdriver.common.by import By方法时,一直报错如下(图一),各种百度都没有解决,最后只能脱离框架,从最原始的代码开 ...
- webpack4.0(01.基础配置和初识)
1.什么是webpack? 2.webpack可以做什莫? 代码转换.文件优化.代码分割.模块合并.自动刷新.代码校验.自动发布 3.我们要学习webpack的什么? 4.使用webpack 1.首先 ...
- Flask 入门(六)
连接数据库 任何一门后端语言都可以连接数据库,python-flask也不例外 flask利用SQLAlchemy ORM连接数据库 接下来,我门来练习如何连接数据库: 1.首先,电脑上得有mysql ...
- 8.4 StringBuilder的介绍及用法(String 和StringBuilder区别)
* StringBuilder:是一个可变的字符串.字符串缓冲区类.** String和StringBuilder的区别:* String的内容是固定的.(方法区的内容)* StringBuilder ...
- python3(四十)datetime timestamp str
"""时间处理 """ __author__on__ = 'shaozhiqi 2019/9/25' # !/usr/bin/env pyt ...