第23講 並び替えソフトをマルチスレッド化する
第5話 最大値排除繰り返し法マルチスレッド版解答例
#include<iostream>
#include<ctime>
#include<stdlib.h>
using namespace std;
using namespace System;
using namespace System::Threading;
void f();
void g(int hj,int ow);
void tf1();
void tf2();
void tf3();
void tf4();
int n,*m;
int main(){
//srand(static_cast<unsigned int>(time(0)));
m=(int *)malloc(2000000);
cout<<"発生させるデータ数をキーボードから入力してください。"<<endl<<"データ数=";
scanf("%d",&n);
f();
DateTime^ hj=DateTime::Now; //開始時間
Thread^ t1=gcnew Thread(gcnew ThreadStart(tf1));
Thread^ t2=gcnew Thread(gcnew ThreadStart(tf2));
Thread^ t3=gcnew Thread(gcnew ThreadStart(tf3));
Thread^ t4=gcnew Thread(gcnew ThreadStart(tf4));
t1->Start();
t2->Start();
t3->Start();
t4->Start();
t1->Join();
t2->Join();
t3->Join();
t4->Join();
g(0,n);
DateTime^ ow=DateTime::Now; //終了時間
TimeSpan sa=ow->Subtract(*hj); //経過時間の計算
cout<<"並び替え後"<<endl;
int i=0;
while(i<n){
if(m[i]<10)cout<<" "<<m[i]<<" ";
if(m[i]>=10 && m[i]<100)cout<<" "<<m[i]<<" ";
if(m[i]>=100)cout<<m[i]<<" ";
if(i>0 && (i+1)%15==0)cout<<endl;
i++;
}
cout<<endl;
cout<<"マルチスレッド版"<<endl;
cout<<"データ数"<<n<<"の場合"<<endl;
cout<<"並び替え時間は"<<sa.TotalSeconds<<"秒です。"<<endl;
}
void tf1(){
g(0,n/4);
}
void tf2(){
g(n/4+1,n/2);
}
void tf3(){
g(n/2+1,3*n/4);
}
void tf4(){
g(3*n/4+1,n);
}
void f(){
int i;
i=0;
while(i<n){
m[i]=rand()%1000;
if(m[i]<10)cout<<" "<<m[i]<<" ";
if(m[i]>=10 && m[i]<100)cout<<" "<<m[i]<<" ";
if(m[i]>=100)cout<<m[i]<<" ";
if(i>0 && (i+1)%15==0)cout<<endl;
i++;
}
cout<<endl;
}
void g(int x,int ow){
int i,max,ik,w;
max=-1;
for(i=x;i<ow;i++){
if(m[i]>max){
max=m[i];
ik=i;
}
}
w=m[x];
m[x]=m[ik];
m[ik]=w;
if(x+1<ow-1)g(x+1,ow);
}
実行例
残念ながら、このマルチスレッドは意味がなかったようです。
かえって遅くなってしまっています。
では、どのように改良すべきでしょうか。
並び替え全体に対して、マルチスレッドするのではなく、
最大値を探す際に、4グループの分けて探し、
その4グループを制したもの同士でまた比較をすれば速くなるのではないでしょうか。
第4話へ 第6話へ
C言語 C++講義第1部へ
C言語 C++講義第2部へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)