一.概述

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

二.内容

  环境: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. E2. String Coloring (hard version)(贪心)

    E2. String Coloring (hard version) time limit per test 1 second memory limit per test 256 megabytes ...

  2. Java并发基础04. 线程技术之死锁问题

    我们知道,使用 synchronized 关键字可以有效的解决线程同步问题,但是如果不恰当的使用 synchronized 关键字的话也会出问题,即我们所说的死锁.死锁是这样一种情形:多个线程同时被阻 ...

  3. mysql清空表后id重1开始

    通过"truncate table 表名"方式重置清空id,让id从1开始自动递增,

  4. (CSS):last-child与:last-of-type区别

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>la ...

  5. PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)

    PTA数据结构与算法题目集(中文)  7-36 社交网络图中结点的“重要性”计算 (30 分) 7-36 社交网络图中结点的“重要性”计算 (30 分)   在社交网络中,个人或单位(结点)之间通过某 ...

  6. Java线程通讯方法之wait()、nofity() 详解

    Java线程通讯方法之wait().nofity() 详解 本文将探讨以下问题: synchronized 代码块使用 notify()与notifyAll()的区别 Java wait(),noti ...

  7. 7L-双线链表实现

    链表是基本的数据结构,尤其双向链表在应用中最为常见,LinkedList 就实现了双向链表.今天我们一起手写一个双向链表. 文中涉及的代码可访问 GitHub:https://github.com/U ...

  8. python3(八) function

    # Python 常用内置函数 https://docs.python.org/3/library/functions.html#abs print(help(abs)) # Return the a ...

  9. CentOS7安装MYCAT中间件

    MYCAT是一个被广泛使用的功能强大的开源的数据库中间件,当然他的理想不仅仅是做一个中间件.这篇文章主要记录MYCAT服务的搭建过程,下篇会继续更新MYCAT的使用配置. 本篇记录将使用CentOS7 ...

  10. 用Python做一个知乎沙雕问题总结

    用Python做一个知乎沙雕问题总结 松鼠爱吃饼干2020-04-01 13:40 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以 ...