目录
目的
验证快速排序算法
内容及要求
1.实现快速排序算法。
2.要求输入待排序元素个数,利用随机函数生成指定数目的元素,元素值的取值范围为[10,1000000]。
3.运行快速排序程序对所生成元素进行排序,要求将元素的初始输入序列和排序后的结果序列都输出在
一个文件中。
4.对相同的待排序元素数,要求程序运行10次,将每次排序所进行的元素比较次数和平均比较次数输
出在文件中。
实验过程
算法设计、代码编写、程序调试、测试数据设计、测试
程序设计
void Interchange(Element*R,int m,int n)
{ int temp;
temp=R[m].GetKey();
R[m].SetKey(R[n].GetKey());
R[n].SetKey(temp);
}
//快速排序递归算法
void QSort(Element *R,int m,int n)//排序记录Rm.....Rn
{
int i,j,k,temp;
if(m<n){
int i,j,k,temp;
Interchange(R,(int)(m+n)/2,m+1);
if(R[m+1].GetKey()>R[n].GetKey())Interchange(R,m+1,n);
if(R[m].GetKey()>R[n].GetKey())Interchange(R,m,n);
if(R[m+1].GetKey()>R[m].GetKey())Interchange(R,m+1,m);
z=z+3;
i=m;
j=n+1;
k=R[m].GetKey();
while(i<j)
{ //用km划分文件(Rm.....Rn)
i++;
while(R[i].GetKey()<k){i++;z++;
}
j--;
while(R[j].GetKey()>k) {j--;z++;
}
if(i<j)
{
temp=R[i].GetKey();
R[i].SetKey(R[j].GetKey());
R[j].SetKey(temp);
}
}
temp=R[m].GetKey();
R[m].SetKey(R[j].GetKey());
R[j].SetKey(temp);
QSort(R,m,j-1);
QSort(R,j+1,n);
}
}
int GetRandom(int a,int b){//生成a到b的随机数 不包含b
int r = rand()%(b-a+1);
return r;
}
int main(){
unsigned int seed;
char filename[] = "o.txt";
ofstream fout("o.txt");
cout<<"请输入要排序元素个数"<<endl;
int k;cin>>k;cout<<"输入成功"<<endl;
Element*R=new Element[k];int t[10];
for(int l=0;l<10;l++){
z=0;
srand(seed=l+3);
int b=1000000;
int a=10;
cout<<"未排序前"<<endl;
fout<<"未排序前"<<endl;
for (int i = 0; i < k; i++){
int q;q=GetRandom(a,b);cout<<q<<" ";
fout<<q<<" ";
R[i].SetKey(q);cout<" ";}
cout<<"输出完毕"<<endl;
fout<<"输出完毕"<<endl;
QSort(R,0,k-1);t[l]=z;cout<<"比较次数: "<<t[l]<<endl;
fout<<"比较次数: "<<t[l]<<endl;
cout<<"排序后"<<endl;
fout<<"排序后"<<endl;
for(int i=0;i<k;i++){
cout<<R[i].GetKey()<<" ";
fout<<R[i].GetKey()<<" ";}
cout<<"排序完毕"<<endl;
fout<<"排序完毕"<<endl;}
int u=0;
for(int l=0;l<10;l++)
{
u= t[l]+u;
}
cout<<endl<<"平均次数"<<int(u/10)<<endl;
fout<<endl<<"平均次数"<<int(u/10)<<endl;
return 0;
}
程序调试
1.Error:unexpected end of file found;
函数调用中括号没有配对出现。
2.在写主函数时,如果是用void main 的形式,可以不用有返回值,如果是int main或status main 的话,要有返回值,即末尾要有return 语句。
3.Error:newline in constant;
字符串常量进行了多行书写,修改后错误消失。
测试数据设计
输入10,随机生成十个记录,并进行十次比较。
结果
总结
程序运行过程有些繁复,还有需要改进的地方。排序过程中快速排序算法容易出现错误。对于表达式的判错情况,根据题目的情况对每次读入的字符进行判断;分号的忘记问题要加强注意。