数据结构课程设计_排序算法比较

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include
#include
#include
#include
using namespace std;
const int maxsize=500;
int R[maxsize];
int A[maxsize];
int i,n,right,left;
int comN1=0,chaN1=0; //直接插入排序中元素比较的次数和交换的次数
int comN2=0,chaN2=0; //冒泡排序中元素比较的次数和交换的次数
int comN3=0,chaN3=0; //快速排序中元素比较的次数和交换的次数
int comN4=0,chaN4=0; //直接选择排序中元素比较的次数和交换的次数
int comN5=0,chaN5=0; //合并排序中元素比较的次数和交换的次数
class NuovSort{
public:
void Myface();
void choose();
void insertsort(int R[],int n); //直接插入排序法
void Bubblesort(int R[],int n); //冒泡排序算法实现
void quicksort(int R[],int left,int right); //快速排序算法实现
void selectsort(int R[],int n); //直接选择排序算法实现
void merge(int R[],int A[],int s,int m,int t);//二路归并排序算法实现
void mergepass(int R[],int A[],int n,int c);
void mergesort(int R[],int n);
};

void NuovSort::Myface() //界面
{
cout<<"\t -->各种排序算法实现<--"<cout<<"#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#"<cout<<"# 1.直接插入排序 #"<cout<<"# 2.冒泡排序 #"<cout<<"# 3.快速排序 #"<cout<<"# 4.直接选择排序 #"<cout<<"# 5.二路归并排序 #"<cout<<"#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#"<cout<<"enter your choose:";
}

void Display(int R[], int n)
{
for(int i=0;i{
cout.width(4);
cout<}
cout<}

void NuovSort::choose()
{
int i,x,n,s,t;
time_t t1,t2;
double tt1,tt2,tt3,tt4,tt5;
cout<<"\t\t\t 欢迎您使用 高扬 的排序程序"<cout<<"请问,需要几个被排序数字?"<do{
cout<<"请输入个数(范围在 1~500 之间): ";
cin>>n;
}
while((n<1)||(n>500));
int left=0,right=n-1;
for(i=0;iR[i]=rand()%888+1; //产生随机数
cout<<"被排序的数字随机产生如下:"<for(i=0;icout<cout<cout<Myface();
int m=0;
cin>>m;
switch(m)
{
case 1:t1=time(NULL);insertsort(R,n);t2=time(NULL);tt1=difftime(t2,t1);
cout<<"排序所需时间为:"<case 2:t1=time(NULL);Bubblesort(R,n);t2=time(NULL);tt2=difftime(t2,t1);
cout<<"排序所需时间为:"<case 3:t1=time(NULL);
cout<<"Before the sort,your answer is:";
for(x=0;x{
cout.width(4);
cout<}
cout<quicksort(R,left,right);
cout<<"排序的结果是:";


for(x=0;xcout<cout<cout<cout<<"元素比较次数为"<cout<<"元素交换次数为"<t2=time(NULL);tt3=difftime(t2,t1);
cout<<"排序所需时间为:"<case 4:t1=time(NULL);selectsort(R,n);t2=time(NULL);tt4=difftime(t2,t1);
cout<<"排序所需时间为:"<case 5:t1=time(NULL);mergesort(R,n);
cout<cout<<"元素比较次数为"<cout<<"元素交换次数为"<t2=time(NULL);tt5=difftime(t2,t1);
cout<<"排序所需时间为:"<default:cout<<"input error !!!"<}
}

//直接插入排序算法实现
void NuovSort::insertsort(int R[],int n)
{
int p,x=1;
for(int i=1;i{
int temp=R[i];
int j=i-1;
while((j>=0)&&(temp{
comN1++;
R[j+1]=R[j];j--;
}
comN1++;
R[j+1]=temp;
chaN1++;
cout<<"第"<for(p=0;p{
cout.width(4);
cout<}
cout<}
cout<cout<<"元素比较次数为"<cout<<"元素交换次数为"<
}

//冒泡排序算法实现
void NuovSort::Bubblesort(int R[],int n)
{
int flag=1;int x=1; //当flag为0时则停止排序
for(int i=1;i{
for(int i=1;i{
//i表示趟数,最多n-1趟
flag=0;

for(int j=n-1;j>=i;j--)
{
comN2++;
if(R[j]{
//发生逆序
int t=R[j];
R[j]=R[j-1];
R[j-1]=t;flag=1;//交换,并标记发生了变化
chaN2++;
}
}
cout<<"第"<for(i=0;i{
cout.width(4);
cout<}
cout<if(flag==0)break;
}
cout<cout<<"元素比较次数为"<cout<<"元素交换次数为"<}

//快速排序算法实现
void NuovSort::quicksort(int R[],int left,int right)
{
int k=left,j=right;
int n=right;
int t,temp=R[k];
while(k{
while((R[j]>temp)&&(j>k))
{
comN3++;
j--;
}
if(k{
t=R[k];
R[k]=R[j];
R[j]=t;
chaN3++;
k++;
}
while((R[k]{
comN3++;
k++;
}
if(k{
t=R[k];
R[k]=R[j];
R[j]=t;
chaN3++;
j--;
}
}
//一次划分得到基准值的正确位置
R[k]=temp;
if(leftquicksort(R,left,k-1);
if(k+1quicksort(R,k+1,right);
}

//直接选择排序算法实现
void NuovSort::selectsort(int R[],int n)
{
int i,j,m,p;
int t;
for(i=0;i{
m=i;
for(j=i+1;jif(R[j]{
comN4++;
m=j;
}
if(m!=i)
{
t=R[i];
R[i]=R[m];
R[m]=t;
chaN4++;
}
co

ut<<"第"<for(p=0;p{
cout.width(4);
cout<}
cout<
}
cout<cout<<"元素比较次数为"<cout<<"元素交换次数为"<}

//二路归并排序算法实现
void NuovSort::merge(int R[],int A[],int s,int m,int t)
//将两个子区间R[s]~R[m]和R[m+1]~R[t]合并,结果存储在A中
{
int i,j,temp;
i=s;
j=m+1;
while((i<=m)&&(j<=t))
{
comN5++;
if(R[i]>=R[j])
{
chaN5++;
temp=R[j];
for(int k=j-1;k>=i;k--)
{
R[k+1]=R[k];
}
R[i]=temp;
j++;
}
else
{
i++;
}
}
for(int l=s;l<=t;l++)
A[l]=R[l];
}

void NuovSort::mergepass(int R[],int A[],int n,int c)
//对R数组做一趟排序归并,结果存入A数组中,n为元素个数,c为区间长度
{
int i,j;
i=0;
while(i+2*c-1<=n-1)//长度均为c的两个区间合并成一个区间
{
merge(R,A,i,i+c-1,i+2*c-1);
i+=2*c;
}
if(i+c-1merge(R,A,i,i+c-1,n-1);
else //仅剩一个区间时直接复制到A中
for(j=i;j<=n-1;j++)
A[j]=R[j];
}

void NuovSort::mergesort(int R[],int n)
{
int c=1,i=0,k=1;
int A[maxsize];
cout<<"二路归并排序的每一次的结果如下:"<cout<<"初始状态:";
Display(R,n);
while(c{
mergepass(R,A,n,c); //一次合并且结果存入A中
i=i+1;
cout<<"第"<k++;
Display(R,n);
c*=2;
mergepass(A,R,n,c); //再次合并且结果存入R中
i=i+1;
cout<<"第"<k++;
Display(R,n);
c*=2;
}
}

//函数的实现
int main()
{
NuovSort v;
char ch;
cout<<"\t\t\t -->各种排序算法实现<--"<do
{
v.choose();
cout<cout<<"\t\t\t --> 继续操作按'Y;,退出按'N' <-"<cin>>ch;
while(ch!='Y'&&ch!='N')
{
cout<<"请根据提示操作!## 继续操作按'Y;,退出按'N' ##"<cin>>ch;
}
}while(ch!='N');
return 0;
}

相关文档
最新文档