.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 浏览器应用程 ...
随机推荐
- Linux 常用命令(遇见了,就记录了 ,随缘吧)
1.实时查看最后日志(默认10条) # tail -f xxxxxx.log 2.查看结尾多少条日志 # tail -n30 -f xxxx.log 3.根据关键字查询日志 # cat xxxxx.l ...
- 多线程之旅(Task 任务)
一.Task(任务)和ThreadPool(线程池)不同 源码 1.线程(Thread)是创建并发工具的底层类,但是在前几篇文章中我们介绍了Thread的特点,和实例.可以很明显发现局限性 ...
- PHP获取所有扩展及扩展下的所有函数签名生成php.snippet
<?php $ext_info = array(); $modules = get_loaded_extensions(); foreach ($modules as $module) { $f ...
- Spire.Cloud 私有化部署教程(二)- Ubuntu 18.04 系统
本教程主要介绍如何在Ubuntu 18.04系统上实现Spire.Cloud私有化部署.CentOS 7系统部署请参考 这篇教程. 详细步骤如下: 一.环境配置 1.关闭防火墙 1)首先查看防火墙状态 ...
- Struts2-学习笔记系列(3)-返回视图
Action执行execute返回字符串,又如何返回对应的页面呢? 关在在于struts中action节点配置的result.如下: 内置有的ERROR SUCCESS等好几种.看源码即可 publ ...
- 【python实现卷积神经网络】损失函数的定义(均方误差损失、交叉熵损失)
代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...
- 如果我选择IT行业,会不会在几年,或者几年后被社会给淘汰??
IT互联网各行业薪资占比,你能拿到多少?随着移动互联网时代的发展,IT行业的需求量也越来越大,而且每年都会新增,当然也会有淘汰. 人生如此之短,都不喜欢自己虚度光阴,也不希望自己所努力的东西成为历史, ...
- 给想学python但还没有接触过的你,python代码的书写规则,小白入门
Python 文件结构 变量命名 注释 单行注释 多行注释 缩进 Python 文件结构 #!/usr/bin/env python3 # 指定python解释器 # -*- coding: utf- ...
- Video tagging systems based on DNNs
Need: With the ever-growth large-scale video in the mobile phone, so what will everyone get from the ...
- Python程序设计 实验 1 熟悉 IDLE 和在线编程平台
------------恢复内容开始------------ 安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名 姚彩琴 学号3190505129 成绩 日期 2 ...