一.概述

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

二.内容

  环境: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. 《SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS》论文阅读

    背景简介 GCN的提出是为了处理非结构化数据(相对于image像素点而言).CNN处理规则矩形的网格像素点已经十分成熟,其最大的特点就是利用卷积进行①参数共享②局部连接,如下图: 那么类比到非结构数据 ...

  2. 类实例调用静态方法(Java)

    前言 第一次看到在Java中是可以通过类实例调用静态方法,当然不推荐这么做,接下来会讲到,但是在C#中通过类实例调用静态方法在编译时就不会通过,这里做下记录. 类实例调用静态方法 首先我们来看一个简单 ...

  3. Linux 常用命令(遇见了,就记录了 ,随缘吧)

    1.实时查看最后日志(默认10条) # tail -f xxxxxx.log 2.查看结尾多少条日志 # tail -n30 -f xxxx.log 3.根据关键字查询日志 # cat xxxxx.l ...

  4. 1032 Sharing (25分)(数组链表)

    To store English words, one method is to use linked lists and store a word letter by letter. To save ...

  5. PTA数据结构与算法题目集(中文) 7-14

    PTA数据结构与算法题目集(中文)  7-14 7-14 电话聊天狂人 (25 分)   给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录 ...

  6. AJAX对数据库增删改查实例

    前端代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title&g ...

  7. 使用Azure Rest API获得Access Token介绍

    背景 本文主要介绍如何获取如何获取Azure Rest API的访问token,所采用的是v2.0版本的Microsoft标识平台,关于1.0和2.0的区别可以参考 https://docs.azur ...

  8. Mysql数据库下载以及安装(至安装成功cmd可访问)

    主要整理了一下Mysql安装的过程 安装的具体步骤见: https://blog.csdn.net/weixin_43465312/article/details/89897580?ops_reque ...

  9. 浅谈RPC与Http

    什么是RPC,RPC原理是什么? 什么是RPC? RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.比如两个 ...

  10. go 名词备注

    1.Protobuf Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关.语言无关.可扩展,可用于通讯协议和数据存储等领域.