第22講 並び替えの方法その2
第4話 最大値排除繰り返し法自己再帰版その2解答例
コード例
#include<ctime>
#include<stdlib.h>
using namespace std;
using namespace System;
void f(int a,int *m);
void g(int a,int *m);
void h(int x,int a,int *m);
int n(int x,int a,int *m);
int main(){
srand(static_cast<unsigned int>(time(0)));
int n,*m;
m=(int *)malloc(2000000);
cout<<"発生させるデータ数をキーボードから入力してください。"<<endl<<"データ数=";
scanf("%d",&n);
f(n,m);
DateTime^ hj=DateTime::Now; //開始時間
g(n,m);
DateTime^ ow=DateTime::Now; //終了時間
TimeSpan sa=ow->Subtract(*hj); //経過時間の計算
cout<<"並び替え時間は"<<sa.TotalSeconds<<"秒です。"<<endl;
}
void f(int a,int *m){
int i;
i=0;
while(i<a){
m[i]=rand()%100;
if(m[i]<10)cout<<" "<<m[i]<<" ";
if(m[i]>=10)cout<<m[i]<<" ";
if(i>0 && (i+1)%25==0)cout<<endl;
i++;
}
cout<<endl;
}
void g(int a,int *m){
int i;
h(0,a,m);
cout<<"並び替え後"<<endl;
i=0;
while(i<a){
if(m[i]<10)cout<<" "<<m[i]<<" ";
if(m[i]>=10)cout<<m[i]<<" ";
if(i>0 && (i+1)%25==0)cout<<endl;
i++;
}
cout<<endl;
}
void h(int x,int a,int *m){
int w,k;
k=n(x,a,m);
w=m[x];
m[x]=m[k];
m[k]=w;
if(x+1<a-1)h(x+1,a,m);
}
int n(int x,int a,int *m){
if(x+1<a){
if(m[x]<m[n(x+1,a,m)]){
return(n(x+1,a,m));
}
else{
return(x);
}
}
else{
return(a-1);
}
}
実行例
一応成功しましたが、非常に重くなってしまいました。
???
原因がわかりません。
原因がわかった方は、是非メールをください。
今まで作った中の最速は、第3話の最大値排除繰り返し法自己再帰版です。
隣項交換繰り返し法の各版より、わずかですが速いという結果です。
というわけで第3話の最大値排除繰り返し法自己再帰版を次話で解説しましょう。
第3話へ 第5話へ
C言語 C++講義第1部へ
C言語 C++講義第2部へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)