index=j;
if(index!
=i)
{
inttmp=a[i];
a[i]=a[index];
a[index]=tmp;
}
}
}
//堆排序
voidSift(inta[],intk,intm)//筛选法调整堆
{
inti=k,j=2*k;//j指向左孩子
while(j<=m)
{
if(jj++;
if(a[i]>a[j])
break;
else
{
inttmp=a[i];
a[i]=a[j];
a[j]=tmp;
i=j;
j=2*i;
}
}
}
voidHeapSort(inta[],intn)//堆排序
{
for(inti=n/2;i>=1;i--)
Sift(a,i,n);
for(inti=1;i{
inttmp=a[1];
a[1]=a[n-i+1];
a[n-i+1]=tmp;
Sift(a,1,n-i);
}
}
//归并排序
voidMerge(inta[],inttmp[],ints,intm,intt)//一次归并算法
{
inti=s,j=m+1,k=s;
while(i<=m&&j<=t)
{
if(a[i]<=a[j])//取两者较小赋值给a1[k+++];
tmp[k++]=a[i++];
else
{
tmp[k++]=a[j++];
}
if(i<=m)
{
while(i<=m)
tmp[k++]=a[i++];
}
else
{
while(j<=t)
tmp[k++]=a[j++];
}
}
}
voidMergePass(inta[],inttmp[],intn,inth)//一趟归并排序算法
{
inti=1;
while(i<=n-2*h+1)
{
Merge(a,tmp,i,i+h-1,i+2*h-1);
i+=2*h;
}
if(iMerge(a,tmp,i,i+h-1,n);
else
{
for(intk=i;k<=n;k++)
tmp[k]=a[k];
}
}
voidMergeSort(inta[],inttmp[],intn)//归并排序非递归算法
{
inth=1;
while(h{
MergePass(a,tmp,n,h);
h=2*h;
MergePass(tmp,a,n,h);
h=2*h;
}
}
voidmain()
{
Start=time(0);
while
(1)
{
cout<<"\t\t各种排序算法比较\n\n";
cout<<"1,设置随机数个数\n";
/
*cout<<"2,C++函数库函数sort()\n";*/
cout<<"2,直接插入排序\n";
cout<<"3,希尔排序\n";
cout<<"4,冒泡排序\n";
cout<<"5,快速排序\n";
cout<<"6,直接选择排序\n";
cout<<"7,堆排序\n";
cout<<"8,归并排序\n";
cout<<"e,退出\n";
charselect;
cin>>select;
switch(select)
{
case'1':
{
cout<<"请输入随机数个数:
\t";
cin>>FactSize;
SetRand(FactSize);
cout<<"随机数为:
\n";
Show(RandArray);
break;
}
case'2':
{
intTmpArray[MaxSize];
for(FactSize=1;RandArray[FactSize]>0;FactSize++)
TmpArray[FactSize]=RandArray[FactSize];
Before=clock();
InsertSort(TmpArray,FactSize);
After=clock();
cout<<"\n直接插入排序算法排序,所用时间
为:
\t"<cout<<"\n是否要显示排序后的随机数?
YorN\t";
charY;
cin>>Y;
if(Y=='Y'||Y=='y')
Show(TmpArray);
break;
}
case'3':
{
intTmpArray[MaxSize];
for(FactSize=1;RandArray[FactSize]!
=NULL;FactSize++)
TmpArray[FactSize]=RandArray[FactSize];
Before=clock();
ShellSort(TmpArray,FactSize);
After=clock();
cout<<"\n希尔排序算法排序,所用时间
为:
\t"<cout<<"\n是否要显示排序后的随机数?
YorN\t";
charY;
cin>>Y;
if(Y=='Y'||Y=='y')
Show(TmpArray);
break;
}
case'4':
{
intTmpArray[MaxSize];
for(FactSize=1;RandArray[FactSize]!
=NULL;FactSize++)
TmpArray[FactSize]=RandArray[FactSize];
Before=clock();
BubbleSort(TmpArray,FactSize);
After=clock();
cout<<"\n冒泡排序算法排序,所用时间
为:
\t"<cout<<"\n是否要显示排序后的随机数?
YorN\t";
charY;
cin>>Y;
if(Y=='Y'||Y=='y')
Show(TmpArray);
break;
}
case'5':
{
intTmpArray[MaxSize];
for(FactSize=1;RandArray[FactSize]!
=NULL;FactSize++)
TmpArray[FactSize]=RandArray[FactSize];
Before=clock();
QuickSort(TmpArray,1,FactSize);
After=clock();
cout<<"\n快速排序算法排序,所用时间
为:
\t"<cout<<"\n是否要显示排序后的随机数?
YorN\t";
charY;
cin>>Y;
if(Y=='Y'||Y=='y')
Show(TmpArray);
break;
}
case'6':
{
intTmpArray[MaxSize];
for(FactSize=1;RandArray[FactSize]!
=NULL;FactSize++)
TmpArray[FactSize]=RandArray[FactSize];
Before=clock();
SimpleSelectSort(TmpArray,FactSize);
After=clock();
cout<<"\n直接选择排序算法排序,所用时间
为:
\t"<cout<<"\n是否要显示排序后的随机数?
YorN\t";
charY;
cin>>Y;
if(Y=='Y'||Y=='y')
Show(TmpArray);
break;
}
case'7':
{
intTmpArray[MaxSize];
for(FactSize=1;RandArray[FactSize]!
=NULL;FactSize++)
TmpArray[FactSize]=RandArray[FactSize];
Before=clock();
HeapSort(TmpArray,FactSize);
After=clock();
cout<<"\n堆排序算法排序,所用时间
为:
\t"<cout<<"\n是否要显示排序后的随机数?
YorN\t";
charY;
cin>>Y;
if(Y=='Y'||Y=='y')
Show(TmpArray);
break;
}
case'8':
{
intTmpArray[MaxSize];
for(FactSize=1;RandArray[FactSize]!
=NULL;FactSize++)
TmpArray[FactSize]=RandArray[FactSize];
intAssist[MaxSize];
Before=clock();
MergeSort(TmpArray,Assist,FactSize);
After=clock();
cout<<"\n归并排序算法排序,所用时间
为:
\t"<cout<<"\n是否要显示排序后的随机数?
YorN\t";
charY;
cin>>Y;
if(Y=='Y'||Y=='y')
Show(TmpArray);
break;
}
case'e':
{
End=time(0);
cout<<"\n程序运行时间:
\t"<<(int)difftime(End,Start)<<"秒\n";
exit
(1);
}
default:
{
cout<<"输入错误!
\n";
break;
}
}
}
}
实验结果
10000个数时
20000个数据时