一.概述

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

二.内容

  环境: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. P - Sudoku Killer HDU - 1426(dfs + map统计数据)

    P - Sudoku Killer HDU - 1426 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为 ...

  2. Activiti7新的API介绍

    一.Activiti7 的组成部分 Activiti Core 作为Activiti 的核心部分,Activiti Cloud 主要是利用云服务来实现分布式业务流程开发. 二.Activiti 新的 ...

  3. 【tensorflow2.0】处理时间序列数据

    国内的新冠肺炎疫情从发现至今已经持续3个多月了,这场起源于吃野味的灾难给大家的生活造成了诸多方面的影响. 有的同学是收入上的,有的同学是感情上的,有的同学是心理上的,还有的同学是体重上的. 那么国内的 ...

  4. python--Django(三)视图

    Django的视图 不同于其他语言的MVC模式,Django采用的是MVT模式,即Model.View.Template,这里的View其实质就是其他语言中的Controller(emmm.....) ...

  5. Linq下有一个非常实用的SelectMany方法,很多人却不会用

    在平时开发中经常会看到有些朋友或者同事在写代码时会充斥着各种for,foreach,这种程式代码太多的话阅读性特别差,而且还显得特别累赘,其实在FCL中有很多帮助我们提高阅读感的方法,而现实中很多人不 ...

  6. C语言数据结构队列

    #include<stdio.h>#include<stdlib.h>struct Node { int data;  Node *next;};struct Queue { ...

  7. 【网络编程01】socket的基础知识-简单网络通信程序

    1.什么是socket socket(套接字),简单来说是IP地址与端口(port)的组合,可以与远程主机的应用程序进行通信.通过IP地址可以确定一台主机,而通过端口则可以确定某一个应用程序.IP+端 ...

  8. hadoop(四)centos7克隆|静态ip|机器名|映射关系|别名配置(完全分布式准备一)|6

    hadoop完全分布式准备工作 克隆默认基础虚拟机三台102/103/104目标:在win10主机上能连上这三台机器,三台机器之间可以互相ping通,用机器名也可ping通.基础虚拟机:创建了文件op ...

  9. alg-最长回文字符串

    class Solution { public: std::string longestPalindrome(const std::string& s) { if (s.empty()) { ...

  10. Salesforce 学习 | 官方总结最实用的Spring '20新功能

    在Spring '20正式发布之前,Trailblazers 社区举行了一个名为Treasure Hunt的在线活动,通过预览沙盒,分享他们认为Spring ‘20中最重要的功能.这篇文章就来盘点一下 ...