开发环境
1、操作系统: Windows 10 X64 2、SDK:Visual Studio 2019
1.问题描述
随机生成100万个1-100,000,000之间的整数,并存入文件data.dat中,要求用二进制的方式进行存储(可以规定存储的策略,方便后继读取。然后,生成n(默认n=10)个线程平行地非重复地读取这个文件,并在内存中从小到大进行排序(相当于把数据文件分成n等分)。当所有的线程都把数据排序好时,主线程对数据进行归并排序,并逐次把排序后的数据存储到新的文件sort.data。
2.完整代码
这里我们用c#控制台应用程序。
using System;
using System.Diagnostics;
using System.Threading;
using System.IO;
using System.Text;
namespace 随机数排序
{
class Program
{
static int N = 10,M=1000,Max=1000000000;
static int[] arr=new int[N*M];
static string path = ".\\data.dat";//data文件名
static string tpath = ".\\sort.dat";//sort文件名
static void creat_nums()//产生并存放随机数
{
if (File.Exists(path))
File.Delete(path);//若已经存在文件,则删除
FileStream fs = File.OpenWrite(path);
BinaryWriter bw = new BinaryWriter(fs, Encoding.Default);
for(int i=0;i<N*M;i++)
{
int t = GetRandomByGuid();
//Console.WriteLine("{0}", t);//测试用
bw.Write(t);
}
fs.Close();//要关闭此进程,否则无法对该文件进行其他操作
}
static int GetRandomSeed()//获得种子
{
byte[] bytes = new byte[4];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
return BitConverter.ToInt32(bytes, 0);
}
static int GetRandomByGuid()//获得单个随机数
{
Random random = new Random(GetRandomSeed());
return random.Next(0, Max);
}
public static void Quick_Sort(int[] arr, int begin, int end)//快排
{
if (begin > end)
return;
int tmp = arr[begin];
int i = begin;
int j = end;
while (i != j)
{
while (arr[j] >= tmp && j >