- 実験の目的:
(1)一般的に使用される内部ソート方法に習熟し、それらを比較すること。
- 実験内容:
ランダム関数を使用してN個のランダム整数(20000以上)を生成し、これらの数値をさまざまな方法で並べ替えます。要件:
(1)上記の問題を解決するために少なくとも3つの方法が使用されます(ヒント、使用できる方法は、ヒルソート、バブルソート、クイックソート、選択的ソート、およびヒープソートです)。そして、ソートされた結果を別のファイルに保存します。
(2)各ソート方法のパフォーマンスをカウントし(上記のコンピューターでプログラムを実行するのにかかる時間と比較して)、より高速な2つの方法を見つけます。
3.実験コード:
#include<bits/stdc++.h>
using namespace std;
const int maxn=20000+100;
int a[maxn],n,b[maxn];
void sortloop(int n,int *b)
{
for(int i=1; i<n; i++)
{
for(int j=i+1; j<=n; j++)
if(b[i]>b[j]) swap(b[i],b[j]);
}
}
void sortquick(int l,int r,int *b)
{
if(l<r)
{
int val=b[l];
int low=l,high=r;
while(low<high)
{
while(b[high]>=val&&low<high) high--;
b[low]=b[high];
while(b[low]<=val&&low<high) low++;
b[high]=b[low];
}
a[low]=val;
sortquick(l,low-1,b);
sortquick(low+1,r,b);
}
}
void sortshell(int n,int *b){
for(int gap=2*n;gap;gap=gap/2){
for(int i=1;i<=gap;i++){
for(int j=i+gap;j<=n;j+=gap){
if(b[j]<b[j-gap]){
int tmp=b[j],q=j-gap;
while(q>=1&&b[q]>tmp){
b[q+gap]=b[q];q-=gap;
}
b[q+gap]=tmp;
}
}
}
}
}
int main()
{
srand(time(0));
clock_t s,e;
n=(rand()*rand()+rand())%20000+1;
for(int i=1; i<=n; i++)
{
a[i]=(rand()*rand()+rand())%10000+1;
b[i]=a[i];
}
cout<<"原数组的元素为:"<<endl;
s=clock();
cout<<"冒泡排序后的元素为"<<endl;
sortloop(n,b);
e=clock();
cout<<"冒泡排序花费的时间为:"<<(double(e-s)/CLOCKS_PER_SEC)<<"s\n";
s=clock();
cout<<"快速排序后的元素为"<<endl;
for(int i=1; i<=n; i++) b[i]=a[i];
sortquick(1,n,b);
e=clock();
cout<<"快速排序花费的时间为:"<<(double(e-s)/CLOCKS_PER_SEC)<<"s\n";
s=clock();
cout<<"希尔排序后的元素为"<<endl;
for(int i=1; i<=n; i++) b[i]=a[i];
sortshell(n,b);
e=clock();
cout<<"希尔排序花费的时间为:"<<(double(e-s)/CLOCKS_PER_SEC)<<"s\n";
return 0;
}