一.概述

  在了解排序算法的同时,想到用多线程排序减少排序的时间,所以写了一个简单的示例,加深印象。下面是具体代码

二.内容

  环境: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多线程归并排序的更多相关文章

  1. 多线程归并排序的实现 java

    多线程是非常适合归并排序的,因为归并排序是分治法,所以分割后可以独立运行,最后将结果归并起来就行了.如何写一个多线程程序呢?今天无聊,总结一下啊. 首先写个普通的归并排序,以后的多线程就调用这个排序. ...

  2. 归并排序 求逆序数 链表的归并排序 多线程归并排序 java

    import java.util.Scanner; public class Main { private static int count=0; public static void mergeso ...

  3. 多线程归并排序(摘自githhub)

    package com.rationalcoding.sort; import java.util.ArrayList; import java.util.Arrays; import java.ut ...

  4. pthread 多线程基础

    本文主要介绍如何通过 pthread 库进行多线程编程,并通过以下例子进行说明. 基于莱布尼兹级数计算 \(\pi\) . 多线程归并排序 参考文章: [1] https://computing.ll ...

  5. 秋招落幕,对自己的总结by2018-10-20

    在今天阿里沟通offer完毕,正式三方也确定了,一切如梦,想想1月的自己还担心未来的自己会花落谁家,到10月的今天,一切尘埃落地.一直不怎么喜欢总结自己的历程,今天无聊的我也总结一波吧. 准确的说没有 ...

  6. java归并排序,单线程vs多线程

    一.什么是归并排序 归并排序又称合并排序,它是成功应用分治技术的一个完美例子.对于一个需要排序的数组A[0..n-1],归并排序把它一分为二:A[0..n/2-1]和A[n/2..n-1],并对每个子 ...

  7. 关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  8. Linux多线程实践(10) --使用 C++11 编写 Linux 多线程程序

    在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从 ...

  9. 使用C++编写linux多线程程序

    前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...

随机推荐

  1. 获取data 数据

    export function getData(el, name, val) { const prefix = 'data-' if (val) { return el.setAttribute(pr ...

  2. GoLang——Hello World,打开新世界的大门

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Go语言系列的第一篇文章,我们来聊聊这门新的语言和它的基础语法. 浅谈Golang 作为程序员而言,往往对于学习新的语言都是有抗拒的. ...

  3. Java并发编程实战 01并发编程的Bug源头

    摘要 编写正确的并发程序对我来说是一件极其困难的事情,由于知识不足,只知道synchronized这个修饰符进行同步. 本文为学习极客时间:Java并发编程实战 01的总结,文章取图也是来自于该文章 ...

  4. 解决:docker-compose端口绑定

    docker-compose 进程绑定 Bind for 0.0.0.0:3825 failed: port is already allocated 查看进程发现有进程在关闭后继续进行 docker ...

  5. Java第十八天,可变参数

    可变参数 1.使用前提 当一个方法的参数需要多个参数,并且这些参数的类型一致时,可以使用可变参数. 2.使用方法 定义方法时使用 3.定义格式 修饰符 返回值类型 方法名(参数类型...变量名){ } ...

  6. javascript入门 之 zTree (一)

    1.安装: 我用的bower工具,所以执行: bower install ztree 2.详细功能与配制,请考官方文档: http://www.treejs.cn/v3/main.php#_zTree ...

  7. C#使用HTML文件中的file文件上传,用C#代码接收上传文件

    单独做图片上传很简单,如果要客户端要上传头像保存到服务器就要稍微麻烦一点点了. 不多说了,直接上源码: private void Upload() { string jsonInfo = string ...

  8. Markdown语法详解-cnblog

    博客的重要性 博客,英文名为Blog,它的正式名称为网络日记. 为什么要写博客? 需要总结和思考.有时候我们一直在赶路,却忘了放慢脚步 提升文笔组织能力 提升学习总结能力 提升逻辑思维能力 帮助他人, ...

  9. 中阶 d06 http协议与servlet

    * 什么是协议 > 双方在交互.通讯的时候, 遵守的一种规范.规则. * http协议 > 针对网络上的客户端 与 服务器端在执行http请求的时候,遵守的一种规范. 其实就是规定了客户端 ...

  10. ES5与ES6 this 指向详细解析(箭头函数)

    首先要明白箭头函数的作用: 箭头函数除了让函数的书写变得很简洁,可读性很好外:最大的优点是解决了this执行环境所造成的一些问题.比如:解决了匿名函数this指向的问题(匿名函数的执行环境具有全局性) ...