数据结构课程设计_排序算法比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 -->各种排序算法实现<--"<
}
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<<"请输入个数(范围在 1~500 之间): ";
cin>>n;
}
while((n<1)||(n>500));
int left=0,right=n-1;
for(i=0;i
cout<<"被排序的数字随机产生如下:"<
int m=0;
cin>>m;
switch(m)
{
case 1:t1=time(NULL);insertsort(R,n);t2=time(NULL);tt1=difftime(t2,t1);
cout<<"排序所需时间为:"<
cout<<"排序所需时间为:"<
cout<<"Before the sort,your answer is:";
for(x=0;x
cout.width(4);
cout<
cout<
cout<<"排序的结果是:";
for(x=0;x
cout<<"排序所需时间为:"<
cout<<"排序所需时间为:"<
cout<
cout<<"排序所需时间为:"<
}
//直接插入排序算法实现
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<<"第"<
cout.width(4);
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<<"第"<
cout.width(4);
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(left
if(k+1
}
//直接选择排序算法实现
void NuovSort::selectsort(int R[],int n)
{
int i,j,m,p;
int t;
for(i=0;i
m=i;
for(j=i+1;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<
//二路归并排序算法实现
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-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<<"二路归并排序的每一次的结果如下:"<
Display(R,n);
while(c
mergepass(R,A,n,c); //一次合并且结果存入A中
i=i+1;
cout<<"第"<
Display(R,n);
c*=2;
mergepass(A,R,n,c); //再次合并且结果存入R中
i=i+1;
cout<<"第"<
Display(R,n);
c*=2;
}
}
//函数的实现
int main()
{
NuovSort v;
char ch;
cout<<"\t\t\t -->各种排序算法实现<--"<
{
v.choose();
cout<
while(ch!='Y'&&ch!='N')
{
cout<<"请根据提示操作!## 继续操作按'Y;,退出按'N' ##"<
}
}while(ch!='N');
return 0;
}